Kar*_*rus 6 c++ cmake shared-libraries libraries
在Ubuntu中,我已经下载了第三方共享库,mylibrary.so我已将其放在目录中/home/karnivaurus/Libraries.我还放置了相关的头文件,myheader.h在目录中/home/karnivaurus/Headers.我现在想要使用cmake在我的C++代码中链接到这个库.这是我的CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.0.0)
project(DemoProject)
include_directories(/home/karnivaurus/Headers)
add_executable(demo demo.cpp)
target_link_libraries(demo /home/karnivaurus/Libraries/mylibrary)
Run Code Online (Sandbox Code Playgroud)
但是,这给了我错误消息:
:-1: error: No rule to make target `/home/karnivaurus/Libraries/mylibrary', needed by `demo'. Stop.
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
虽然此处发布的其他答案是有效的,但它已经过时了。CMake 现在为在代码中使用预构建的外部库提供了更好的解决方案。事实上,CMake 本身甚至不鼓励在其文档中使用link_directories()。
该target_link_libraries()命令采用非常特定的语法来链接到外部库。IMPORTED更现代的解决方案是为外部库创建CMake 目标:
add_library(MyExternalLib SHARED IMPORTED)
# Provide the full path to the library, so CMake knows where to find it.
set_target_properties(MyExternalLib PROPERTIES IMPORTED_LOCATION /home/karnivaurus/Libraries/mylibrary.so)
Run Code Online (Sandbox Code Playgroud)
然后,您可以稍后在代码中使用此导入的 CMake 目标,并将其链接到其他目标:
target_link_libraries(demo PRIVATE MyExternalLib)
Run Code Online (Sandbox Code Playgroud)
有关在 CMake 代码中使用外部第三方库的其他方法,请参阅此处的响应。
您可以使用静态库的完整路径。要链接动态链接,最好像link_directories()这样使用:
cmake_minimum_required(VERSION 2.0.0)
project(DemoProject)
include_directories(/home/karnivaurus/Headers)
link_directories(/home/karnivaurus/Libraries)
add_executable(demo demo.cpp)
target_link_libraries(demo mylibrary)
Run Code Online (Sandbox Code Playgroud)
并确保文件名中mylibrary有前缀lib和后缀.so(即全名是/home/karnivaurus/Libraries/libmylibrary.so)。
为了使您的项目更加灵活,您最好编写一个查找器模块并避免像这样的硬编码路径/home/karnivaurus/*