如何通过CMake将自有源码集成至现有开源项目且不修改原项目文件
如何在不修改开源项目的前提下用CMake扩展其可执行文件
我来帮你搞定这个问题——不用碰开源项目的目录或CMakeLists,完全在自己的独立项目里扩展它,最终生成包含你代码的可执行文件,用CMake就能轻松实现。
核心思路
本质上是把开源项目当作一个静态库依赖,在自己的项目里编译这个库,再把你的代码和这个库链接起来生成新的可执行文件。如果开源项目原本生成的是可执行文件,我们只需要跳过它的main函数编译,改用自己的入口逻辑即可。
第一步:规划目录结构
先把你的代码和开源项目源码分开存放,比如这样的结构:
my_extension/ ├── CMakeLists.txt # 你的顶层CMake配置文件 ├── src/ │ ├── my_main.cpp # 你的入口文件+扩展代码 │ └── my_utils.h # 你的自定义头文件 └── third_party/ └── open_source_proj/ # 原封不动放开源项目的所有源码 ├── CMakeLists.txt ├── src/ └── include/
第二步:编写你的CMake配置
关键是在自己的CMakeLists.txt里引入开源项目,并将它编译为静态库(而非原有的可执行文件)。这里分两种情况处理:
情况1:开源项目支持编译为库(规范的CMake项目通常会提供)
很多规范的开源项目会有开关变量(比如BUILD_SHARED_LIBS、BUILD_LIB之类),允许编译为库而非可执行。你的CMake可以这么写:
cmake_minimum_required(VERSION 3.10) project(my_extended_exec) # 对齐开源项目的C++标准,避免兼容性问题 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 告诉开源项目编译为静态库(具体变量要看开源项目的文档) set(BUILD_EXECUTABLE OFF CACHE BOOL "Disable open source executable build") set(BUILD_STATIC_LIB ON CACHE BOOL "Build open source as static library") # 引入开源项目,它会生成一个静态库目标(比如叫open_source_lib) add_subdirectory(third_party/open_source_proj) # 添加你的源码 add_executable(my_extended_exec src/my_main.cpp ) # 链接开源静态库到你的可执行文件 target_link_libraries(my_extended_exec PRIVATE open_source_lib) # 引入开源项目的头文件路径 target_include_directories(my_extended_exec PRIVATE third_party/open_source_proj/include )
情况2:开源项目只支持编译为可执行
如果开源项目没有提供编译为库的选项,我们手动收集它的源码(排除原有的main.cpp),自己构建静态库:
cmake_minimum_required(VERSION 3.10) project(my_extended_exec) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 收集开源项目的所有源码,排除它的main入口文件 file(GLOB_RECURSE OPEN_SOURCE_SOURCES third_party/open_source_proj/src/*.cpp third_party/open_source_proj/src/*.h ) list(REMOVE_ITEM OPEN_SOURCE_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/third_party/open_source_proj/src/main.cpp") # 构建开源项目为静态库 add_library(open_source_lib STATIC ${OPEN_SOURCE_SOURCES}) target_include_directories(open_source_lib PUBLIC third_party/open_source_proj/include) # 添加你的源码并链接库 add_executable(my_extended_exec src/my_main.cpp ) target_link_libraries(my_extended_exec PRIVATE open_source_lib) target_include_directories(my_extended_exec PRIVATE third_party/open_source_proj/include)
第三步:编写你的扩展代码
在你的my_main.cpp里,调用开源项目的核心逻辑,再加上你的自定义代码:
#include "my_utils.h" // 引入开源项目的核心头文件 #include "open_source_proj/core.h" int main() { // 先执行开源项目的原有核心逻辑 open_source_proj::run_core_logic(); // 加入你的扩展功能 my_custom_function(); return 0; }
第四步:编译运行
像正常CMake项目一样构建即可:
mkdir build && cd build cmake .. make
生成的my_extended_exec就是包含你代码和开源项目逻辑的可执行文件。
注意事项
- 确保你的C++标准、编译器和开源项目一致,避免编译错误
- 如果开源项目有外部依赖,需要在你的CMake里指定这些依赖的路径(比如用
CMAKE_PREFIX_PATH) - 尽量优先使用开源项目自带的编译为库的选项,手动收集源码的方式适合小型项目,大型项目可能会有遗漏的文件或依赖
内容的提问来源于stack exchange,提问作者J. Lemein
相关产品推荐
相关产品推荐

