You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下CMake链接第三方库报错:No rule exists to target

解决CMake链接第三方共享库的错误

错误原因分析

  1. 路径指向错误:你使用${CMAKE_CURRENT_BINARY_DIR}(构建目录)定位第三方库,但实际库文件存放在源码目录(${CMAKE_CURRENT_SOURCE_DIR})的lib/extern/lib下,导致CMake无法找到目标文件。
  2. 重复覆盖IMPORTED库属性:创建单个lib IMPORTED库后多次设置IMPORTED_LOCATION,后续设置会完全覆盖前面的配置,最终仅liba12.so被关联,且路径仍不正确。
  3. 头文件权限配置不当:私有头文件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:01:04