当我尝试在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变量并发出这样的configure命令(我认为):
export LIBS=-ldl && ./configure
但我现在该怎么做?
更新:
所以似乎找到了(或至少一个)库,但不包含有问题的符号。也许它尝试使用/ lib中的32位库?
有没有办法反汇编/lib64/libdl.so.2以确保它有引用dlopen等?
现在问题似乎是将构建工具引导到库的正确版本。
答案 0 :(得分:33)
由于这个问题出现在谷歌上,并且这两个答案都没有指向正确的解决方案,这是:
在您的CMakeLists.txt中添加${CMAKE_DL_LIBS}
以链接idl。
它看起来应该类似于:
target_link_libraries(ExpandableTest
${CMAKE_DL_LIBS}
Expandable
ExpandableTestLibrary
)
答案 1 :(得分:1)
您可能需要添加target_link_libraries() - 请参阅link text
答案 2 :(得分:1)
在CMakeLists.txt中添加它,它应该可以工作:
SET (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ldl")