CMake单目录独立构建时库链接失败、找不到依赖头文件如何解决?
CMake独立子目录构建配置方案
问题核心原因
- common库未安装公共头文件,也未导出CMake配置,单独构建A时无法自动获取头文件路径与库文件位置
- A的CMakeLists未配置common头文件搜索路径,也未声明对已安装common库的依赖
- 独立构建A时不会加载common目录的CMake逻辑,因此
COMMON_LIB_NAME变量完全不生效
第一步:修改common/CMakeLists.txt
set(COMMON_LIB_NAME CommonTemp) set(SRC_CODE ${CMAKE_CURRENT_SOURCE_DIR}/include/common.h ${CMAKE_CURRENT_SOURCE_DIR}/src/common.cpp ) add_library(${COMMON_LIB_NAME} SHARED ${SRC_CODE}) # 配置库的公共头文件路径,构建和安装阶段自动生效 target_include_directories(${COMMON_LIB_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> ) # 安装库文件 install(TARGETS ${COMMON_LIB_NAME} EXPORT ${COMMON_LIB_NAME}Targets DESTINATION ~/tempDir/lib ) # 安装公共头文件 install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION ~/tempDir/include ) # 导出CMake配置文件,供其他项目find_package调用 install(EXPORT ${COMMON_LIB_NAME}Targets FILE ${COMMON_LIB_NAME}Config.cmake DESTINATION ~/tempDir/lib/cmake/${COMMON_LIB_NAME} )
第二步:修改A/CMakeLists.txt(B、C目录同理)
cmake_minimum_required(VERSION 3.10) project(ServiceA) # 声明查找已安装的CommonTemp库,需提前安装common find_package(CommonTemp REQUIRED PATHS ~/tempDir/lib/cmake/CommonTemp) add_executable(ServiceA src/a.cpp) # 直接链接导入的CommonTemp目标,自动继承头文件路径,无需手动配置include target_link_libraries(ServiceA PUBLIC CommonTemp) install(TARGETS ServiceA DESTINATION ~/tempDir/bin/A)
构建流程
- 先单独构建安装common:
cd common mkdir build && cd build cmake .. make && make install
- 再单独构建A/B/C任意目录:
cd A mkdir build && cd build cmake .. make && make install
内容的提问来源于stack exchange,提问作者JungWoo
相关产品推荐
相关产品推荐

