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
相关产品推荐
相关产品推荐

