linux库问题

时间:2011-04-26 12:11:06

标签: linux gcc

每个人都在那里, 我正在编写一个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 个答案:

答案 0 :(得分:4)

尝试添加:

-L/usr/java/lib

到您的链接器命令,因为那是您的链接器无法找到的库:I_GetCreatedJavaVMs@SUNWprivate_1.1

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

答案 1 :(得分:2)

链接器发出警告,指出未找到对函数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。

答案 2 :(得分:0)

这对我有用:

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