Проблема с подключением библиотеки Linux - HADOOP HDFS C API - PullRequest
1 голос
/ 23 ноября 2011

Я пытаюсь запустить приложение hdfs_test, которое поставляется вместе с библиотекой C API.Когда я компилирую приложение с помощью команды:

gcc myTest.c -I/usr/HDFS/src/c++/libhdfs -L/usr/HDFS/build/c++/Linux-i386-32/lib -lhdfs -o myTest

Я делаю это после установки LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/usr/lib/jvm/default-java/jre/lib/i386:/usr/lib/jvm/default-java/jre/lib/i386/server:/usr/lib/jvm/default-java/jre/lib/i386/libjava.so

Я получаю следующую ошибку:

/usr/HDFS/build/c++/Linux-i386-32/lib/libhdfs.so: undefined reference to `JNI_GetCreatedJavaVMs'
/usr/HDFS/build/c++/Linux-i386-32/lib/libhdfs.so: undefined reference to `JNI_CreateJavaVM'
collect2: ld returned 1 exit status

Я видел этот пост: проблема с библиотекой linux , и я подумал, что это может быть актуально, даже если я не получаю предупреждение "библиотека не найдена".

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 04 августа 2018

Вам необходимо установить связь как с libhdfs, так и с libjvm!

Полагаю, лучший способ помочь - показать вам рабочую настройку. Вот мои «LIBS» в моем Makefile:

LIBS=-L/usr/hdp/2.6.4.0-91/usr/lib/ -lhdfs -L/usr/jdk64/jdk1.8.0_112/jre/lib/amd64/server/ -ljvm -Wl,-rpath=/usr/hdp/2.6.4.091/usr/lib/:/usr/jdk64/jdk1.8.0_112/jre/lib/amd64/server/

Вы хотите использовать "-Wl, -rpath", поэтому вам не нужно использовать LD_LIBRARY_PATH. И вот результат ldd после связывания. Вы хотите убедиться, что все библиотеки разрешены:

[my-prompt]$ ldd myprogram
    linux-vdso.so.1 =>  (0x00007ffcf7048000)
    libhdfs.so.0.0.0 => /usr/hdp/2.6.4.0-91/usr/lib/libhdfs.so.0.0.0 (0x00007fd120723000)
    libjvm.so => /usr/jdk64/jdk1.8.0_112/jre/lib/amd64/server/libjvm.so (0x00007fd11f730000)
    libc.so.6 => /lib64/libc.so.6 (0x000000390be00000)
    libdl.so.2 => /lib64/libdl.so.2 (0x000000390c600000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x000000390ca00000)
    /lib64/ld-linux-x86-64.so.2 (0x000000390ba00000)
    libm.so.6 => /lib64/libm.so.6 (0x000000390c200000)

Когда вы запускаете его, так как он в конечном итоге запускает Java-байт-код, вам также нужно установить CLASSPATH. Вот что вы можете сделать:

export CLASSPATH=`hadoop classpath --glob`
./your-program

Это поздний ответ, но я надеюсь, что он может спасти других людей от некоторых проблем.

0 голосов
/ 23 ноября 2011

Я считаю, что -ljava отсутствует в вашей команде компиляции.

...