在 CMake 项目中动态更改编译器标志
Posted
技术标签:
【中文标题】在 CMake 项目中动态更改编译器标志【英文标题】:Changing compiler flags on the fly in a CMake project 【发布时间】:2013-11-28 21:01:30 【问题描述】:我有一个大型 cmake 项目,目前完全是为生产而构建的;默认的 gcc 标志选项类似于-fpic -s -O3
。
用不同的 gcc 标志重新编译我的项目的一小部分的最简单方法是什么?
但我知道如何做到这一点的唯一方法是使用 cmake 重新生成我的 makefile,构建子项目,然后再次重新生成 makefile。
$ cmake ../ -DCMAKE_C_FLAGS="-fpic -g"
$ make subproject
$ cmake ../ -DCMAKE_C_FLAGS="-fpic -s -O3"
我希望能够将 cmake 排除在外,然后执行以下操作:
$ make C_FLAGS="-fpic -g" subproject
【问题讨论】:
为什么不简单地使用 2 个构建目录 Release 和 Debug? 我想没有什么反对这样做的。这是否意味着我所要求的是不可能的? 【参考方案1】:您可以使用COMPILE_FLAGS
target property 为每个目标设置编译标志。
请注意,这不能直接从命令行设置,因此您必须更改您的 CMakeLists.txt。但是,您可以包含一个option,它允许从命令行切换它:
add_library(subproject...)
set_property(TARGET subproject PROPERTY COMPILE_FLAGS "-fpic")
option(BUILD_SUBPROJECT_WITH_O3 Toggles optimizations for the subproject" OFF)
if(BUILD_SUBPROJECT_WITH_O3)
set_property(TARGET subproject PROPERTY APPEND COMPILE_FLAGS "-s" "-O3")
else()
set_property(TARGET subproject PROPERTY APPEND COMPILE_FLAGS "-g")
endif()
【讨论】:
【参考方案2】:如果你只是想为构建一个文件添加一个标志(在我的例子中,我添加了 -H 来跟踪一个头文件),你可以这样做:
make VERBOSE=1
然后,将调用复制到编译器,添加您的标志,然后直接从 shell 调用编译器,而不是通过 make。我的例子,注意最后的 -H :
arm-none-eabi-g++ -DARM_MATH_DSP -DARM_MATH_LOOPUNROLL -DCPU_CORTEX_M55=1 -DPLATFORM_HAL=1 -DPRJ_DES_STR="\"ARM ML Embedded Evaluation Kit for MPS3 FPGA and FastModel\"" -DPRJ_VER_STR=\"21.5\" -I/home/ubuntu/contents/ml-embedded-evaluation-kit/dependencies/core-software/drivers/timing_adapter/include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/tflite-model -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/model-parameters -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/application/hal/include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/application/hal/platforms/bare-metal/bsp/cmsis-device/include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/application/hal/platforms/bare-metal/bsp/include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/application/hal/platforms/bare-metal/bsp/bsp-core/include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/application/hal/platforms/bare-metal/bsp/bsp-packs/mps3/include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/application/hal/platforms/bare-metal/utils/include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/application/hal/platforms/bare-metal/images/include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/application/hal/platforms/bare-metal/data_presentation/lcd/include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/source/application/hal/platforms/bare-metal/timer/include -I/home/ubuntu/build/generated/bsp -I/home/ubuntu/contents/ml-embedded-evaluation-kit/dependencies/core-driver/include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/dependencies/cmsis/CMSIS/DSP/Include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/dependencies/cmsis/CMSIS/Core/Include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/dependencies/cmsis/Device/ARM/ARMCM55/Include -I/home/ubuntu/contents/ml-embedded-evaluation-kit/dependencies/cmsis/Device/ARM/ARMCM55/Include/Template -DARM_NPU=1 -DMPS3_PLATFORM=1 -DLOG_LEVEL=LOG_LEVEL_INFO -DACTIVATION_BUF_SRAM_SZ=0x00400000 -std=c++11 -g -Wno-unused-parameter -Wno-missing-field-initializers -o CMakeFiles/ethos-u-test.dir/source/main.cpp.obj -c /home/ubuntu/contents/ml-embedded-evaluation-kit/source/main.cpp -H
【讨论】:
以上是关于在 CMake 项目中动态更改编译器标志的主要内容,如果未能解决你的问题,请参考以下文章