无法找到在同一个目录中的CMakeLists.txt的共享库(Cannot find shared

2019-10-21 13:05发布

在我的源代码目录,我有被称为共享库文件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?

Answer 1:

不要使用link_directories

指定完整路径库(可能使用${CMAKE_CURRENT_SOURCE_DIR}如果这就是你拥有了它,或者使用find_library与路径和名称(不lib前缀或扩展名)一个'更便携的解决方案,虽然东西告诉我可移植性是不是你的关心...



Answer 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所在。



Answer 3:

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

是的,这将于事无补。 如果库被称为libAlpha.so然后-lAlpha告诉使用它的链接,所以cmake的使用是正确的选择,问题是不是与库的名称。

为什么CMake的找不到这个库,即使是在同一个目录中的CMakeLists.txt?

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

您需要将目录添加到链接程序的搜索路径,这与做-L选项。 我不知道如何告诉cmake的使用该选项,而是一个快速浏览一下cmake的文档表明,它可能是link_directories如使用link_directories(.)添加-L. 到链接器命令。



文章来源: Cannot find shared library in same directory as CMakeLists.txt
标签: c++ ubuntu cmake