C++ 链接器可以';在Eclipse/JNI/ANT中找不到lib
我正在尝试在Linux下构建一个大型Java/c++项目,涉及Eclipse中的JNI和ANT。源C++文件中的一个调用数学计算的C++ 链接器可以';在Eclipse/JNI/ANT中找不到lib,c++,eclipse,ant,linker,java-native-interface,C++,Eclipse,Ant,Linker,Java Native Interface,我正在尝试在Linux下构建一个大型Java/c++项目,涉及Eclipse中的JNI和ANT。源C++文件中的一个调用数学计算的 Log10>()/Cuth>函数。项目编译得很好,但链接失败,它抱怨找不到链接log10()所需的libm.so库 我的问题是,即使在执行以下步骤后,我也无法正确地告诉Eclipse链接该文件: 在链接器选项中添加了正确的库路径 在链接器包含列表中添加了对libm的引用 将-lm添加到完整的编译选项列表中 将LD_LIBRARY_PATH设置为指向库的位置 已将库复
log10()
所需的libm.so
库
我的问题是,即使在执行以下步骤后,我也无法正确地告诉Eclipse链接该文件:
libm
的引用-lm
添加到完整的编译选项列表中LD_LIBRARY_PATH
设置为指向库的位置System.LoadLibrary("m");
注意我是如何把lib和.so去掉的
但是,您抱怨C++中存在链接器问题,不能链接到动态文件。您只能链接到静态库或静态导出库(因此您需要在编译时链接到的libm.so文件,然后您的程序在运行时需要libm.so)
您可以发布您正在接收的确切消息以及您何时接收它吗?不确定,但您是否在x86_64机器上编译32位?64位,编译64位。链接器明确地想要64位版本的
libm.so
,它甚至告诉我它的位置(/lib64/
)。然后它继续告诉我,我“只是”需要链接到那个位置,事情就会好起来。当我这样做时,它只会吐出同样的错误。然后键入readelf-h/lib64/libm.so.6 | grep Class
会给你ELF64
?(可能不是.so.6,取决于您的版本)是的,它是一个ELF64
。请尝试将-lm
移动到链接器标志的末尾?(假设你不仅仅是那个标志)调用“代码> Log10”(<代码> >是在C++文件中完成的。JNI在编译java代码之前需要编译C++源文件,所以C++还在编译阶段。完整的错误消息如下:source.o:对符号“log10@@GLIBC_2.2.5”的引用未定义。ld:注意:“log10@@GLIBC_2.2.5”是在DSO/lib64/libm.so.6中定义的,因此请尝试将其添加到链接器命令行
,然后事实上,chrisb在其评论中建议的方法是正确的。您需要静态链接libm(将-lm添加到编译器标志中,最好在include libraries语句的末尾)。。。奇怪的是,这种方法没有解决你的问题。你能发布你正在使用的编译命令吗?你能用math.h和-lm编译一个Hello World吗?当然可以,Hello World和其他最小编译也可以。这是一个由大量源文件组成的庞大项目,因此我认为我需要查看各个ANT makefiles,以确保-lm在需要时存在。然而,根据我已经完成并提到的步骤,这应该是可行的。