如何用CMake从同一类构建两个不同数组大小的可执行文件
解决方案
步骤1:修改C++代码,将数组大小改为可配置宏
先修改a.h,把固定的数组大小替换为预编译宏,同时保留默认值以兼容原有逻辑:
#include <array> // 定义数组大小的宏,默认值为4 #ifndef MY_ARRAY_SIZE #define MY_ARRAY_SIZE 4 #endif class A { public: using MyArray = std::array<double, MY_ARRAY_SIZE>; // ... 其他成员函数或变量 };
步骤2:修改CMakeLists.txt,构建两个独立可执行文件
你有两种实现方式,根据项目复杂度选择:
方式1:直接为每个可执行文件编译代码(适合小型项目)
这种方式不需要单独的库目标,直接将a.cpp和main.cpp添加到两个可执行目标中,并分别设置编译宏:
# 构建默认数组大小(4)的可执行文件 add_executable(myapp main.cpp a.cpp) # 设置编译宏,指定数组大小为4 target_compile_definitions(myapp PRIVATE MY_ARRAY_SIZE=4) # 构建数组大小为20的可执行文件 add_executable(myapp-20 main.cpp a.cpp) # 设置编译宏,指定数组大小为20 target_compile_definitions(myapp-20 PRIVATE MY_ARRAY_SIZE=20)
方式2:为不同数组大小构建独立库(适合大型项目)
如果mylib包含较多代码,可通过独立库目标管理不同编译版本(这里用静态库示例):
# 构建数组大小为4的静态库 add_library(mylib_4 STATIC a.h a.cpp) target_compile_definitions(mylib_4 PRIVATE MY_ARRAY_SIZE=4) # 构建数组大小为20的静态库 add_library(mylib_20 STATIC a.h a.cpp) target_compile_definitions(mylib_20 PRIVATE MY_ARRAY_SIZE=20) # 链接默认库到myapp add_executable(myapp main.cpp) target_link_libraries(myapp PRIVATE mylib_4) # 链接20大小的库到myapp-20 add_executable(myapp-20 main.cpp) target_link_libraries(myapp-20 PRIVATE mylib_20)
原理说明
- 每个目标的
target_compile_definitions会在编译时传递预编译宏给编译器,因此a.cpp会被编译两次:一次使用MY_ARRAY_SIZE=4,一次使用MY_ARRAY_SIZE=20,生成完全独立的二进制文件。 - 预编译宏的
PRIVATE属性表示该宏仅对当前目标的编译生效,不会传递给依赖它的目标;如果main.cpp也需要直接使用该宏,可改为PUBLIC。
内容的提问来源于stack exchange,提问作者Nhan Ly-Trong
相关产品推荐
相关产品推荐

