在Ubuntu中,我下载了一个第三方共享库mylibrary.so
,并将其放置在目录/home/karnivaurus/Libraries
中。我还在/home/karnivaurus/Headers
目录中放置了相关的头文件myheader.h
。现在,我想使用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)
但是,这给出了错误消息:
:-1: error: No rule to make target `/home/karnivaurus/Libraries/mylibrary', needed by `demo'. Stop.
到底怎么回事?
发布于 2020-06-02 21:38:01
虽然这里发布的另一个答案是有效的,但它已经过时了。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)
然后,您可以在稍后的代码中使用这个导入的CMake目标,并将其链接到其他目标:
target_link_libraries(demo PRIVATE MyExternalLib)
有关在CMake代码中使用外部第三方库的其他方法,请参阅响应here。
发布于 2014-11-09 03:25:34
您可以使用静态库的完整路径。要链接到动态链接,最好像这样使用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)
并确保mylibrary
在文件名中有前缀lib
和后缀.so
(即全名为/home/karnivaurus/Libraries/libmylibrary.so
)。
为了使您的项目更加灵活,最好编写一个并避免像/home/karnivaurus/*
这样的硬编码路径
https://stackoverflow.com/questions/26807329
复制相似问题