Ubuntu下CMake链接第三方库报错:No rule exists to target
解决CMake链接第三方共享库的错误
错误原因分析
- 路径指向错误:你使用
${CMAKE_CURRENT_BINARY_DIR}(构建目录)定位第三方库,但实际库文件存放在源码目录(${CMAKE_CURRENT_SOURCE_DIR})的lib/extern/lib下,导致CMake无法找到目标文件。 - 重复覆盖IMPORTED库属性:创建单个
libIMPORTED库后多次设置IMPORTED_LOCATION,后续设置会完全覆盖前面的配置,最终仅liba12.so被关联,且路径仍不正确。 - 头文件权限配置不当:私有头文件
include/private被设为PUBLIC,会导致安装时暴露不必要的内部头文件,不符合CMake最佳实践。
修正后的CMakeLists.txt
cmake_minimum_required(VERSION 3.9...3.19) if(${CMAKE_VERSION} VERSION_LESS 3.12) cmake_policy(VERSION ${CMAKE_VERSION}) endif() project(mylib VERSION 0.0.1 DESCRIPTION "Test" LANGUAGES CXX ) # 修正C++编译标志的变量引用 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DTPM_POSIX") set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 构建自有静态库 add_library(${PROJECT_NAME} STATIC src/private/file2.cpp src/public/file1.cpp ) # 逐个声明第三方IMPORTED共享库 add_library(liba SHARED IMPORTED) set_target_properties(liba PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/lib/extern/lib/liba.so" ) add_library(libb SHARED IMPORTED) set_target_properties(libb PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/lib/extern/lib/libb.so" ) add_library(liba12 SHARED IMPORTED) set_target_properties(liba12 PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/lib/extern/lib/liba12.so" ) # 链接所有第三方库到自有库 target_link_libraries(${PROJECT_NAME} PUBLIC liba libb liba12 ) # 配置头文件目录,区分PUBLIC和PRIVATE权限 target_include_directories(${PROJECT_NAME} PUBLIC $<INSTALL_INTERFACE:lib/extern/include> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/lib/extern/include> $<INSTALL_INTERFACE:include/public> $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/public> PRIVATE $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/private> ) # 构建测试可执行文件 add_executable(test src/main.cpp) target_link_libraries(test PRIVATE mylib)
额外说明
- 每个第三方库单独声明为IMPORTED目标,可明确管理各库依赖,避免属性覆盖问题。
- 私有头文件放在
PRIVATE目录下,确保仅编译自有库时可见,不会对外暴露。 - 推荐使用out-of-source构建(如在项目根目录创建
build文件夹,进入后执行cmake ..再编译),避免源码目录被构建文件污染。
内容的提问来源于stack exchange,提问作者Mahew
相关产品推荐
相关产品推荐

