проблема с библиотекой linux - PullRequest
4 голосов
/ 26 апреля 2011

Все там, Я пишу код 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 файлы связаны в программе?

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

Попробуйте добавить:

-L/usr/java/lib

К вашей команде компоновщика, поскольку это библиотека, которую компоновщик не может найти: I_GetCreatedJavaVMs@SUNWprivate_1.1.

Небольшой совет: не стоит возиться с LD_LIBRARY_PATH. Просто исправьте вашу команду компоновщика.

2 голосов
/ 05 июня 2014

Линкер выдает предупреждение о не найденной ссылке на функцию JNI_CreateJavaVM@SUNWprivate_1.1

/ usr / bin / ld: warning: 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.

0 голосов
/ 08 сентября 2017

Вот что у меня сработало:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...