Linux库链接问题 - HADOOP HDFS C API

时间:2011-11-23 03:00:39

标签: linux gcc hadoop hdfs

我正在尝试运行与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, 我认为它可能是相关的,即使我没有得到“未找到库”警告。

提前致谢

2 个答案:

答案 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

这是一个很晚的答案,但我希望它可以为其他人省些麻烦。