在我的源代码目录,我有被称为共享库文件libAlpha.so
。 然后,在我的CMakeLists.txt文件,我有:
target_link_libraries(MyProgram Alpha)
然而,这给我的错误:
usr/bin/ld: cannot find -lAlpha
如果我重命名库文件Alpha.so
或lAlpha.so
,我得到了同样的错误。 同样,如果我改用行:
target_link_libraries(MyProgram libAlpha)
要么:
target_link_libraries(MyProgram libAlpha.so)
为什么CMake的找不到这个库,即使是在同一个目录中的CMakeLists.txt?
不要使用link_directories
。
指定完整路径库(可能使用${CMAKE_CURRENT_SOURCE_DIR}
如果这就是你拥有了它,或者使用find_library
与路径和名称(不lib
前缀或扩展名)一个'更便携的解决方案,虽然东西告诉我可移植性是不是你的关心...
当您使用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
所在。
如果我重命名库文件Alpha.so或lAlpha.so,我得到了同样的错误。
是的,这将于事无补。 如果库被称为libAlpha.so
然后-lAlpha
告诉使用它的链接,所以cmake的使用是正确的选择,问题是不是与库的名称。
为什么CMake的找不到这个库,即使是在同一个目录中的CMakeLists.txt?
因为当前目录没有特殊含义的连接(也没有目录的CMakeLists.txt是,因为链接知道在所有一无所知的cmake)。
您需要将目录添加到链接程序的搜索路径,这与做-L
选项。 我不知道如何告诉cmake的使用该选项,而是一个快速浏览一下cmake的文档表明,它可能是link_directories
如使用link_directories(.)
添加-L.
到链接器命令。