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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:02:41