使用cmake构建项目,如何让它知道所需的库?

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; make install”路径,我可以设置LIBS变量并像这样执行configure命令(我认为):

export LIBS=-ldl && ./configure

但是我现在该怎么做呢?

更新:

看起来库已经被找到了(或者至少是其中之一),但是没有包含所需的符号。也许它会尝试使用/lib中的32位库?

有没有一种方法可以反汇编/lib64/libdl.so.2以确保它确实具有dlopen等引用?

现在问题似乎是指导构建工具使用正确版本的库。

3个回答

37

由于这个问题在谷歌上出现并且两个答案都没有指向正确的解决方案,所以在这里提供一个:

在你的CMakeLists.txt中添加${CMAKE_DL_LIBS}来链接idl。 它应该看起来类似于这样:

target_link_libraries(ExpandableTest
    ${CMAKE_DL_LIBS}
    Expandable
    ExpandableTestLibrary
)

这是更兼容的答案,应该被接受。 - Rangel Reale
3
我想补充一下,我不得不将${CMAKE_DL_LIBS}移到列表的最后位置。否则它对我没有用。 - Anonymous

1

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


可能会起作用,但这不是“我的”项目,所以最好不要编辑CMakeLists.txt文件。 - dala

0

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

SET (CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} -ldl")

2
这是特定于Linux的,不是最佳解决方案,请参见上面对CMAKE_DL_LIBS的引用。 - ideasman42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接