【问题标题】:Cannot find shared library in same directory as CMakeLists.txt在与 CMakeLists.txt 相同的目录中找不到共享库
【发布时间】:2015-01-07 18:22:02
【问题描述】:

在我的源代码目录中,我有一个名为libAlpha.so 的共享库文件。然后,在我的 CMakeLists.txt 文件中,我有:

target_link_libraries(MyProgram Alpha)

但是,这给了我错误:

usr/bin/ld: cannot find -lAlpha

如果我将库文件重命名为 Alpha.solAlpha.so,我会收到同样的错误。同样,如果我改为使用以下行:

target_link_libraries(MyProgram libAlpha)

或:

target_link_libraries(MyProgram libAlpha.so)

为什么cmake找不到这个库,即使它和CMakeLists.txt在同一个目录下?

【问题讨论】:

  • 尝试使用link_directories 通知链接器在哪些目录中可以找到库

标签: c++ ubuntu cmake


【解决方案1】:

不要使用link_directories

指定库的完整路径(可能使用${CMAKE_CURRENT_SOURCE_DIR},如果你有它,或者使用带有该路径和名称的find_library(不带lib 前缀或扩展名)以获得“更便携”的解决方案,尽管有些事情告诉我可移植性不是您关心的问题...

【讨论】:

  • 谢谢!所以,我尝试了 `target_link_libraries(MyProgram ${CMAKE_CURRENT_SOURCE_DIR}/libAlpha.so),它有效:)
【解决方案2】:

当您使用cmake 时,您通常在与源文件和CMakeLists.txt 文件所在的目录不同的目录中构建(并且推荐做法)。因此,如果您遵循这种做法(并且错误表明您可能会这样做),链接器将无法在该目录中找到库。所以你要么需要通过link_directories()添加它:

link_directories( ${CMAKE_CURRENT_SOURCE_DIR} )

或者你可以为库设置一个属性:

add_library( Alpha DYNAMIC IMPORTED )
set_property( TARGET Alpha PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/libAlpha.so )

如果CMakeLists.txt你把这些命令放在不在同一个目录下,你可以添加路径:

link_directories( ${CMAKE_CURRENT_SOURCE_DIR}/foobar )
link_directories( ${CMAKE_CURRENT_SOURCE_DIR}/.. )

请记住变量CMAKE_CURRENT_SOURCE_DIR 设置为CMakeLists.txt 所在的路径。

【讨论】:

  • 任何想法,为什么add_library(googletest DYNAMIC IMPORTED) 行会导致Cannot find source file: DYNAMIC Tried extensions .c .C .c++ ...
【解决方案3】:

如果我将库文件重命名为 Alpha.so 或 lAlpha.so,我会得到同样的错误。

是的,这根本没有帮助。如果库被称为libAlpha.so,那么-lAlpha 告诉链接器使用它,所以cmake 使用了正确的选项,问题不在于库的名称。

为什么cmake找不到这个库,即使它和CMakeLists.txt在同一个目录下?

因为当前目录对链接器没有特殊意义(CMakeLists.txt所在的目录也没有,因为链接器对cmake一无所知)。

您需要将目录添加到链接器的搜索路径,这是通过-L 选项完成的。我不知道如何告诉 cmake 使用该选项,但快速查看 cmake 文档表明它可能是 link_directories 例如使用link_directories(.)-L. 添加到链接器命令中。

【讨论】:

  • @Slava,这就是我说添加 -L 的原因。指向链接器命令,而不是指向包含 CMakeLists.txt 文件的目录
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多