在与 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.so
或 lAlpha.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
所在的路径。
在我的源代码目录中,我有一个名为 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在同一个目录?
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
所在的路径。