每个人都在那里, 我正在编写一个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文件如何在程序中链接?
答案 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