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

CMake项目中无需重跑CMake,为单个翻译单元覆盖CXXFLAGS

解决方法

方法1:通过Make命令行传递编译宏

CMake生成的Makefile通常支持在调用make时直接传递编译选项,覆盖或追加默认编译标志。你可以直接在命令行中定义需要的宏,确保选项正确传递给编译器:

make -C build/code/tests benchmarks CXXFLAGS="-DYOMM2_BENCHMARK_HIERARCHIES=3 -DYOMM2_BENCHMARK_OBJECTS=1000"

如果CXXFLAGS不生效(比如CMake生成的Makefile固定了该变量),可以尝试使用CMake默认的编译标志变量CMAKE_CXX_FLAGS:

make -C build/code/tests benchmarks CMAKE_CXX_FLAGS="-DYOMM2_BENCHMARK_HIERARCHIES=3 -DYOMM2_BENCHMARK_OBJECTS=1000"

方法2:手动直接编译源文件

如果Makefile的变量传递始终有问题,你可以绕开构建系统,直接用编译器编译目标文件,只需指定必要的头文件路径、链接库和宏定义:

# 替换<include_dir>为项目头文件路径,<libs>为需要链接的库(比如-lpthread等)
g++ -DYOMM2_BENCHMARK_HIERARCHIES=3 -DYOMM2_BENCHMARK_OBJECTS=1000 tests/benchmarks.cpp -o build/code/tests/benchmarks -I<include_dir> <libs>

编译完成后直接运行可执行文件:

./build/code/tests/benchmarks

方法3:修改CMakeLists.txt(无需重新生成整个构建系统)

如果上述方法都不行,你可以修改对应目标的CMake配置,让它支持从Make命令行接收宏定义。在tests/CMakeLists.txt中找到benchmarks目标的定义,添加:

target_compile_definitions(benchmarks PRIVATE
    $<$<NOT:$<DEFINED:YOMM2_BENCHMARK_HIERARCHIES>>:YOMM2_BENCHMARK_HIERARCHIES=2>
    $<$<NOT:$<DEFINED:YOMM2_BENCHMARK_OBJECTS>>:YOMM2_BENCHMARK_OBJECTS=100>
)

无需重新运行CMake,直接调用make时传递变量即可:

make -C build/code/tests benchmarks YOMM2_BENCHMARK_HIERARCHIES=3 YOMM2_BENCHMARK_OBJECTS=1000

CMake生成的Makefile会自动检测CMakeLists.txt的变化,重新生成对应规则,无需重新执行完整的CMake配置流程。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:45:59