2011-04-26 63 views
4

大家都在那里, 我写了一个c代码,当我编译它时有一个奇怪的问题。 源代码正常。 我有以下选项编译:linux库问题

$ 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 `[email protected]_1.1' 
/home/hadoop/project/hadoop-0.20.2/c++/Linux-amd64-64/lib/libhdfs.so: undefined reference to `[email protected]_1.1' 
collect2: ld returned 1 exit status 

我搜索libjvm.so我发现它在我在/ usr/JAVA/lib目录系统。

我做了一个它的符号链接,但没有工作。

我复制库中的几个地方,如usr/lib目录检查LD_LIBRARY_PATH 但不能设法编译它一次又一次

任何一个可以告诉我,我在做什么显示相同的错误的程序错了? 如何将.so文件链接到gcc? 或.so文件如何链接到程序中?

回答

4

尝试增加:

-L/usr/java/lib 

到链接器的命令,因为这是你的连接不能够找到库:[email protected]_1.1

有点小建议:与LD_LIBRARY_PATH混淆不是一个好主意。只需修复您的链接器命令。

+0

我的代码是有同样的错误。系统在多个位置找到libjvm.so。但是,“添加-LLOCATION_to_libjvm.so”的解决方案似乎没有任何影响。 – Causality 2013-04-11 22:15:35

2

链接给出了有关未找到引用警告功能[email protected]_1.1

在/ usr/bin中/ LD:警告:libhdfs.so:未定义的引用 `[email protected]_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

这对我工作:由OP描述

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