проблема с библиотекой Linux

#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