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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:37:57