在我的源代码目录中,我有一个名为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位于同一个目录中?
答案 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.
添加到链接器命令。