我正在尝试运行与C API库一起提供的hdfs_test应用程序。当我使用命令编译应用程序时:
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 library problem, 我认为它可能是相关的,即使我没有得到“未找到库”警告。
提前致谢
答案 0 :(得分:0)
我相信编译命令中缺少-ljava
。
答案 1 :(得分:0)
您需要同时链接libhdfs和libjvm!
我想最好的帮助方法是向您展示有效的设置。这是我的Makefile中的“ LIBS”:
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
这是一个很晚的答案,但我希望它可以为其他人省些麻烦。