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

Cannot find shared library in same directory as CMakeLists.txt

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

If I rename the library file to Alpha.so or lAlpha.so, I get the same error.

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

Why can cmake not find this library, even though it is in the same directory as CMakeLists.txt?

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

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

不要使用 link_directories

指定库的完整路径(可能使用 ${CMAKE_CURRENT_SOURCE_DIR} 如果你有它,或者使用 find_library 与该路径和名称(没有 lib 前缀或扩展名) 对于 'more portable' 解决方案,虽然有些事情告诉我可移植性不是你关心的...

当您使用 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 所在的路径。