11

当我尝试在 64 位 linux (debian) 机器上使用 cmake 和 gcc 构建此项目时,链接器出现错误:

Linking C executable ../../../../cpsadamsx
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlopen'
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlclose'
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlerror'
/home/dala/lib64/libSimTKcommon.so: undefined reference to `dlsym'
collect2: ld returned 1 exit status
make[2]: *** [cpsadamsx] Error 1
make[1]: *** [sundials/examples/cpodes/serial/CMakeFiles/cpsadamsx.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

显然 dlopen、dlclose、dlerror 和 dlsym 是对 libdl.so 的引用。我在 /lib64/libdl.so.2 中有那个库,但为什么找不到呢?

会不会是一个普通的 './configure; 制作; make install'-path 我可以设置 LIBS 变量并发出这样的配置命令(我认为):

export LIBS=-ldl && ./configure

但是我现在该怎么做呢?

更新:

所以似乎找到了(或至少一个)库,但不包含有问题的符号。也许它尝试使用 /lib 中的 32 位库?

有没有办法反汇编 /lib64/libdl.so.2 以确保它确实有引用 dlopen 等?

现在问题似乎将构建工具引导到库的正确版本。

4

3 回答 3

37

由于这个问题出现在谷歌上,并且两个答案都不会指向正确的解决方案,因此它是:

在您的 CMakeLists.txt 中添加${CMAKE_DL_LIBS}针对 idl 的链接。它应该类似于:

target_link_libraries(ExpandableTest
    ${CMAKE_DL_LIBS}
    Expandable
    ExpandableTestLibrary
)
于 2011-11-23T14:31:20.563 回答
1

可能您需要添加 target_link_libraries() - 请参阅链接文本

于 2009-08-13T21:06:12.643 回答
0

在 CMakeLists.txt 中添加它,它应该可以工作:

SET (CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -ldl")
于 2010-01-20T15:24:40.223 回答