链接到共享库时,cmake中没有“制定目标的规则”错误

时间:2014-11-07 18:04:15

标签: 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)

然而,这给了我错误信息:

:-1: error: No rule to make target `/home/karnivaurus/Libraries/mylibrary', needed by `demo'.  Stop.

发生了什么?

2 个答案:

答案 0 :(得分:2)

您可以使用静态库的完整路径。要使用动态链接,最好使用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)。

为了让您的项目更灵活,您最好编写finder module并避免使用/home/karnivaurus/*

等硬编码路径

答案 1 :(得分:2)

虽然此处发布的其他答案有效,但已过时。 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