Eclipse中如何实现CMake全局项目与子项目同时支持独立编译导入?
需求合理性说明
这个需求完全符合CMake的设计逻辑,CMake原生支持模块同时作为子项目和独立项目构建的场景,也叫「standalone构建」与「子目录构建」兼容模式,你当前的实现思路是正确的,只是可以优化得更规范、可维护性更高。
优化实现方案
- 用CMake内置变量判断构建模式,无需自定义标志位
不需要手动定义FULL_BUILD、PROJECT_BUILD这类自定义标识,直接比较CMAKE_CURRENT_SOURCE_DIR和CMAKE_SOURCE_DIR两个内置变量即可:如果二者相等,说明当前是直接对该库执行CMake配置,属于独立构建;如果不等,说明是被上层CMakeLists.txt作为子模块引入的。
- 用CMake内置变量判断构建模式,无需自定义标志位
- 优化公共CMake模块的引用逻辑
首先在common-cmake/CMakeLists.txt中添加模块路径导出逻辑,全局构建时自动把公共目录加入模块搜索路径:
# common-cmake/CMakeLists.txt 新增内容 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}" CACHE INTERNAL "Global CMake module search path") # 原来的公共逻辑保留 include(common-functions1.cmake) include(common-functions2.cmake)这样全局构建时所有子模块都可以直接调用公共函数,不需要重复引入。
- 优化公共CMake模块的引用逻辑
- 子库CMakeLists.txt标准写法
每个子库的CMakeLists.txt按照以下结构编写,兼容两种构建模式:
cmake_minimum_required(VERSION 3.10) project(lib1 VERSION 1.0.0 LANGUAGES CXX) # 独立构建场景下的初始化逻辑 if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) # 加入公共cmake模块搜索路径 list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/../common-cmake") # 引入公共函数 include(common-functions1) include(common-functions2) # 此处可补充独立构建需要的全局配置,比如编译标准、默认安装路径等 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ compilation standard") set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/install" CACHE PATH "Default install path") endif() # 以下为lib1本身的构建逻辑,两种构建模式下都会执行 add_library(lib1 src/someClass.cpp ) target_include_directories(lib1 PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> ) # 测试目录引入逻辑,可加判断控制是否编译测试 if(BUILD_TESTING) add_subdirectory(test) endif()- 子库CMakeLists.txt标准写法
- Eclipse独立项目生成方案
需要给单个库生成Eclipse项目时,不要在源码目录直接执行CMake,建议单独创建构建目录避免污染源码:
# 在MyProject根目录执行,给lib1单独生成Eclipse项目 mkdir build-lib1 && cd build-lib1 cmake -G "Eclipse CDT4 - Unix Makefiles" ../lib1之后直接把build-lib1目录作为现有项目导入Eclipse即可,不会出现找不到公共函数、缓存不存在的错误。
- Eclipse独立项目生成方案
内容的提问来源于stack exchange,提问作者cancech
相关产品推荐
相关产品推荐

