【问题标题】:CMake "TARGET_LINK_LIBRARIES cannot find -lfoo" but it is in the same directory as another libraryCMake“TARGET_LINK_LIBRARIES 找不到 -lfoo”,但它与另一个库位于同一目录中
【发布时间】:2016-03-15 06:07:15
【问题描述】:

如上所述,我在编译使用一些动态库 (.so) 的 c++ 项目(使用 CMake)时遇到问题。 我的目录中有 3 个库(即home/sources/lib/)。当我只告诉编译器(在 CMake 文件中)使用第一个库(foo1.so)时,它可以工作(只有这个文件,顺序无关紧要)。但它不适用于任何其他库(foo2.sofoo2.so)。所有 3 个文件都有 .so 扩展名。

注意:目录和文件名已更改,但结构相同。 我使用的库不是由我编译/创建的,而是来自第 3 方。 (不管它们什么时候坏了,对吧?)


这就是我的 CMake 文件的样子:

cmake_minimum_required(VERSION 3.3)
project(MyProj)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -m64")
INCLUDE_DIRECTORIES("/home/sources/include")
LINK_DIRECTORIES("/home/sources/lib")

set(SOURCE_FILES main.cpp)
add_executable(MyProj ${SOURCE_FILES})

TARGET_LINK_LIBRARIES(MyProj foo1.so)

将上面的行改为此行不再起作用:

TARGET_LINK_LIBRARIES(MyProj foo1.so foo2.so foo3.so)

只是另一种写法(没有帮助)

TARGET_LINK_LIBRARIES(MyProj foo1.so)
TARGET_LINK_LIBRARIES(MyProj foo2.so)
TARGET_LINK_LIBRARIES(MyProj foo3.so)

如上所述:所有 3 个库都在同一个目录中(我用 LINK_DIRECTORIES 指代)

这是我在尝试使用其他库编译时遇到的错误(如所说只有 foo1.so 有效):

[ 50%] Linking CXX executable MyProj
/usr/bin/ld: cannot find -lfoo2
/usr/bin/ld: cannot find -lfoo3
collect2: error: ld returned 1 exit status
make[3]: *** [MyProj] Error 1
make[2]: *** [CMakeFiles/MyProj.dir/all] Error 2
make[1]: *** [CMakeFiles/MyProj.dir/rule] Error 2
make: *** [MyProj] Error 2

P.S.:我在这里发帖之前做了一些研究,但没有发现任何其他人有这个“奇怪”的问题。如果没有一些谷歌搜索技能,我肯定不会用我的 CMake 文件走这么远^^

【问题讨论】:

  • 可能foo2.sofoo3.so 对于给定平台的格式不正确,而foo1.so 是好的。您可以对它们中的每一个使用file 命令并比较输出。
  • 感谢您的建议(没想到file 命令...)。但它们相同的:foo3.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., strippedfoo2.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., strippedfoo1.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=..., stripped

标签: c++ gcc cmake clion


【解决方案1】:

不确定,但在我看来,CMake 正在寻找 libfoo1.so,而文件实际上是 foo1.so(同样适用于 foo2foo3

试试"importing" 库:

add_library(foo1 SHARED IMPORTED)
set_property(TARGET foo1 PROPERTY IMPORTED_LOCATION "/home/sources/lib/libfoo1.so")
# same thing for foo2 and foo3 ...

target_link_libraries(MyProj foo1 foo2 foo3)

编辑

还可以提供库的完整路径:

target_link_libraries(MyProj "/home/sources/lib/libfoo1.so"
                             "/home/sources/lib/libfoo2.so"
                             "/home/sources/lib/libfoo3.so")

【讨论】:

  • 查看编辑;) 除了使用fooX 来引用libfooX.solibfooX.a,这些是(AFAIK)在 CMake 中链接外部库的两种方法。我个人更喜欢“导入目标”方法,因为它更灵活(例如,您可以为每个平台设置IMPORTED_LOCATION 属性,而无需更改target_link_libraries() 调用)。如果您有多个目标使用相同的外部库,它也需要更少的输入。
  • 我在写这里之前尝试了 EDIT 方法,但这个方法也没有用。只有IMPORTED 方式在这里有所帮助 - 我不明白为什么......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 1970-01-01
  • 2013-05-19
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多