如何用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_
相关产品推荐
相关产品推荐

