Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 链接器可以';在Eclipse/JNI/ANT中找不到lib_C++_Eclipse_Ant_Linker_Java Native Interface - Fatal编程技术网

C++ 链接器可以';在Eclipse/JNI/ANT中找不到lib

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设置为指向库的位置 已将库复

我正在尝试在Linux下构建一个大型Java/c++项目,涉及Eclipse中的JNI和ANT。源C++文件中的一个调用数学计算的 Log10>()/Cuth>函数。项目编译得很好,但链接失败,它抱怨找不到链接
log10()
所需的
libm.so

我的问题是,即使在执行以下步骤后,我也无法正确地告诉Eclipse链接该文件:

  • 在链接器选项中添加了正确的库路径
  • 在链接器包含列表中添加了对
    libm
    的引用
  • -lm
    添加到完整的编译选项列表中
  • LD_LIBRARY_PATH
    设置为指向库的位置
  • 已将库复制到当前目录
  • 我做错了什么/有没有人有过在Eclipse中正确链接libs的经验?有什么建议吗?

    这有点让人困惑。 如果在java环境中运行时找不到库:

    在调用log10之前,请尝试在java环境中加载.so库

    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在需要时存在。然而,根据我已经完成并提到的步骤,这应该是可行的。