#linux #gcc
#linux #gcc
Вопрос:
Все присутствующие, я пишу код на c, у которого возникает странная проблема при его компиляции. Исходный код в порядке. Я компилирую его со следующим параметром:
$ gcc above_sample.c -I/home/hadoop/project/hadoop-0.20.2/src/c /libhdfs -L/home/hadoop/project/hadoop-0.20.2/c /Linux-amd64-64/lib -lhdfs -o above_sample.
Но это показывает вывод, помещенный вот так:
/usr/bin/ld: warning: libjvm.so, needed by /home/hadoop/project/hadoop-0.20.2/c /Linux-amd64-64/lib/libhdfs.so, not found (try using -rpath or -rpath-link) /home/hadoop/project/hadoop-0.20.2/c /Linux-amd64-64/lib/libhdfs.so: undefined reference to `JNI_CreateJavaVM@SUNWprivate_1.1'
/home/hadoop/project/hadoop-0.20.2/c /Linux-amd64-64/lib/libhdfs.so: undefined reference to `JNI_GetCreatedJavaVMs@SUNWprivate_1.1'
collect2: ld returned 1 exit status
Я искал libjvm.so я нашел это в своей системе в / usr / java / lib.
Я создал символическую ссылку на это, но не сработало.
я скопировал библиотеку в несколько мест, таких как usr / lib, проверьте LD_library_Path, но не смог скомпилировать программу, она снова и снова выдает одну и ту же ошибку
Кто-нибудь может сказать мне, что я делаю не так? как связать файл .so с gcc? или как файлы .so связаны в программе?
Ответ №1:
Попробуйте добавить:
-L/usr/java/lib
К вашей команде компоновщика, поскольку это библиотека, которую ваш компоновщик не может найти: I_GetCreatedJavaVMs@SUNWprivate_1.1
.
Небольшой совет: с этим не стоит связываться LD_LIBRARY_PATH
. Просто исправьте свою команду компоновщика.
Комментарии:
1. В моем коде возникает та же ошибка, что и в OP. Система обнаружила libjvm.so в нескольких местах. Однако решение путем «добавления -LLOCATION_to_libjvm.so «похоже, не имеет никакого эффекта.
Ответ №2:
Компоновщик выдает предупреждение о не найденной ссылке на функцию JNI_CreateJavaVM@SUNWprivate_1.1
/usr/bin/ld: предупреждение: libhdfs.so : неопределенная ссылка на `JNI_CreateJavaVM@SUNWprivate_1.1 ‘
Это имя функции может быть специфичным для библиотеки из Sun / Oracle Hotspot JVM. Другие JVM могут иметь другое имя. Например, у моего OpenJDK было только более короткое имя, такое как JNI_CreateJavaVM, и компоновщик выдал мне такое же предупреждение.
Вы можете получить список функций из вашего libjvm.so выполнив команду:
readelf -s libjvm.so | grep JNI_CreateJavaVM # given that you are in catalog containing libjvm.so
Если выходные данные не содержат требуемой функции, возможно, вам захочется установить другой JDK.
Ответ №3:
Это то, что сработало для меня:
CDH=/opt/cloudera/parcels/CDH
OS_ARCH=amd64
gcc hdfs_example.c -I$CDH/include -L$CDH/lib64
-L/usr/java/default/jre/lib/${OS_ARCH}/server
-ljvm -lhdfs -o hdfs_write_test