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

如何用CMake为旧库两次编译同一文件(不同编译定义)

用CMake实现同一文件两次编译(不同编译定义)

针对旧库场景,核心思路是通过**对象库(Object Library)**将同一源文件编译两次(分别带不同编译定义),再将生成的目标文件合并到最终库中。具体实现方案如下:

方案一:直接创建对象库并合并到最终库

# 1. 为目标源文件创建第一个对象库,指定编译定义COMPILE_OPTION_A
add_library(obj_with_def_a OBJECT src/target_file.cpp)
target_compile_definitions(obj_with_def_a PRIVATE COMPILE_OPTION_A)
# 同步旧库的编译环境(如头文件目录、C++标准等)
target_include_directories(obj_with_def_a PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_compile_features(obj_with_def_a PRIVATE cxx_std_11)

# 2. 为同一源文件创建第二个对象库,指定不同编译定义COMPILE_OPTION_B
add_library(obj_with_def_b OBJECT src/target_file.cpp)
target_compile_definitions(obj_with_def_b PRIVATE COMPILE_OPTION_B)
# 同步相同的编译环境
target_include_directories(obj_with_def_b PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_compile_features(obj_with_def_b PRIVATE cxx_std_11)

# 3. 构建最终的旧库,将两个对象库的目标文件纳入
add_library(your_old_library STATIC)
# 添加两个对象库的编译产物
target_sources(your_old_library PRIVATE $<TARGET_OBJECTS:obj_with_def_a> $<TARGET_OBJECTS:obj_with_def_b>)
# 添加旧库的其他源文件
target_sources(your_old_library PRIVATE src/other_file_1.cpp src/other_file_2.cpp)

方案二:基于现有旧库目标修改

如果已经存在旧库的CMake目标,可先移除重复编译的源文件,再补充对象库的产物:

# 原旧库目标(假设已存在)
add_library(your_old_library STATIC src/target_file.cpp src/other_file_1.cpp)

# 1. 从原目标中移除需要重复编译的源文件
target_sources(your_old_library REMOVE src/target_file.cpp)

# 2. 创建两个带不同编译定义的对象库
add_library(obj_def_x OBJECT src/target_file.cpp)
target_compile_definitions(obj_def_x PRIVATE FEATURE_X_ENABLED)
# 同步原库的编译属性
target_link_libraries(obj_def_x PUBLIC your_old_library)

add_library(obj_def_y OBJECT src/target_file.cpp)
target_compile_definitions(obj_def_y PRIVATE FEATURE_Y_ENABLED)
target_link_libraries(obj_def_y PUBLIC your_old_library)

# 3. 将对象库产物添加回原旧库
target_sources(your_old_library PRIVATE $<TARGET_OBJECTS:obj_def_x> $<TARGET_OBJECTS:obj_def_y>)

关键注意事项

  • 对象库仅生成目标文件(.o/.obj),不会产出单独的库文件,适合合并到现有库中,不破坏旧库的输出结构。
  • 必须保证两个对象库的编译环境(头文件、语言标准、编译选项等)与旧库一致,避免编译或链接错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 19:30:10