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

CMake编译可执行文件同时生成可链接静态库的方案问询

第一步:修改first目录的CMakeLists.txt

这个配置会同时生成你需要的不含main的静态库文件,以及原有测试用的可执行程序:

cmake_minimum_required(VERSION 3.7)

project(testproject)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 查找SDL依赖
find_package(SDL2 REQUIRED)

# 将公共代码编译为静态库(单个.a文件,不含main代码)
add_library(first_static STATIC
    first.cpp
    first.h
)
# 配置静态库的头文件路径和依赖,后续链接该库的目标会自动继承这些配置
target_include_directories(first_static
    PUBLIC
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${SDL2_INCLUDE_DIRS}
)
target_link_libraries(first_static
    PUBLIC
        ${SDL2_LIBRARIES}
)

# 原有测试用可执行程序,仅编译main.cpp并链接上面的静态库
add_executable(first_exec
    main.cpp
)
target_link_libraries(first_exec
    PRIVATE
        first_static
)

编译完成后,你会在first/build目录下看到生成的libfirst_static.a文件,这就是你需要的单个可链接目标文件。


第二步:配置second目录的CMakeLists.txt

假设你的second目录结构如下:

second/
    main.cpp
    CMakeLists.txt

对应CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.7)

project(second_project)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 查找SDL依赖,和first项目保持版本一致
find_package(SDL2 REQUIRED)

# 生成第二个组件的可执行文件
add_executable(second_exec
    main.cpp
)

# 指定first项目的头文件搜索路径,替换为你实际的first目录路径
target_include_directories(second_exec
    PRIVATE
        /absolute/or/relative/path/to/first/
)

# 链接first项目生成的静态库,替换为你实际的libfirst_static.a路径
target_link_libraries(second_exec
    PRIVATE
        /absolute/or/relative/path/to/first/build/libfirst_static.a
        ${SDL2_LIBRARIES}
)

构建流程说明

  1. 先进入first/build目录执行cmake .. && make,完成静态库和测试可执行文件的编译
  2. 再进入second的build目录执行cmake .. && make,即可完成第二个组件的编译,不需要重复编译first的公共代码

注意事项:两个项目的C++标准、编译选项、SDL版本需要保持一致,避免出现链接错误。如果修改了first的公共代码,只需要重新编译first的静态库,再重新编译second即可,增量编译效率远高于重复编译源码。

内容的提问来源于stack exchange,提问作者user2138149

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 03:21:04