无法在与CMakeLists.txt相同的目录中找到共享库

时间:2015-01-07 18:22:03

标签: c++ ubuntu cmake

在我的源代码目录中,我有一个名为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位于同一个目录中?

3 个答案:

答案 0 :(得分:2)

请勿使用link_directories

指定库的完整路径(如果您拥有它,可以使用${CMAKE_CURRENT_SOURCE_DIR},或者使用find_library使用该路径和名称(不带lib前缀或扩展名)一个“更便携”的解决方案,虽然有些东西告诉我可移植性不是你的关注......

答案 1 :(得分:2)

使用cmake时,通常在单独的目录中构建(建议练习),而不是源文件和CMakeLists.txt文件。因此,如果您遵循这种做法(并且错误显示您可能会这样做),则链接器无法找到位于该目录中的库。所以你需要通过link_directories()来添加它:

link_directories( ${CMAKE_CURRENT_SOURCE_DIR} )

或者您可以将属性设置为lib:

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所在的路径。

答案 2 :(得分:0)

  

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

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

  

为什么cmake找不到这个库,即使它与CMakeLists.txt位于同一个目录中?

因为当前目录对链接器没有特殊意义(目录CMakeLists.txt也没有,因为链接器根本不了解cmake)。

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