C为汇编器制作单独的标志

问题描述 投票:0回答:2

我正在尝试使用 GCC 交叉编译器为 ARM 目标交叉编译项目。我创建了一个目标,并使用 target_compile_options() 设置 ABI 标志(-mcpu、-mfpu 等)等内容,并定义了哪个 target_compile_definitions()。但是,我现在遇到的问题是这些标志也传递给汇编器调用。有没有办法为汇编器调用使用单独的汇编器标志?

[ 65%] Building CXX object CMakeFiles/fsfw_example.dir/bsp_stm32/main.cpp.obj
arm-none-eabi-g++ -DSTM32H743xx -DUSE_HAL_DRIVER 
-Ibla\bla <more includes here> -g -specs=nosys.specs 
-specs=nano.specs -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard 
-mthumb -ffunction-sections -fdata-sections 
-std=gnu++11 -o CMakeFiles\fsfw_example.dir\bsp_stm32\main.cpp.obj 
-c C:\Users\Robin\Documents\FSFW\fsfw_example\bsp_stm32\main.cpp

[ 66%] Building ASM object CMakeFiles/fsfw_example.dir/bsp_stm32/startup_stm32h743xx.s.obj
    arm-none-eabi-as -DSTM32H743xx -DUSE_HAL_DRIVER -Ibla\bla <more includes here> 
-mcpu=cortex-m7;-mfpu=fpv5-d16;-mfloat-abi=hard;-mthumb -g -specs=nosys.specs 
-specs=nano.specs -mcpu=cortex-m7 -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb 
-ffunction-sections -fdata-sections -o CMakeFiles\fsfw_example.dir\bsp_stm32\startup_stm32h743xx.s.obj 
-c C:\Users\Robin\Documents\FSFW\fsfw_example\bsp_stm32\startup_stm32h743xx.s

问题是:arm-none-eabi-as 无法处理定义。是否可以专门针对汇编程序编译过程删除它们? 我还尝试设置源特定标志,但这似乎不起作用,目标编译选项/定义似乎具有优先级。

亲切的问候 罗宾

assembly cmake arm cross-compiling
2个回答
1
投票

我设法通过使用带有 -x assembler-with-cpp 选项的 arm-none-eabi-gcc 编译器作为 CMAKE_ASM_COMPILER 来解决这个问题,让 GCC 在汇编之前通过 C 预处理器运行它。我为此使用了生成器表达式:

target_compile_options(${TARGET_NAME} PRIVATE
    $<$<COMPILE_LANGUAGE:C>:${C_DEFS} ${C_FLAGS}>
    $<$<COMPILE_LANGUAGE:CXX>:${CXX_DEFS} ${CXX_FLAGS}>
    $<$<COMPILE_LANGUAGE:ASM>:-x assembler-with-cpp ${ASM_FLAGS}>
)

使用

arm-none-eabi-as
只能处理像
.macro
这样的汇编指令,而不能处理像
#define
这样的 CPP 指令(为此需要 CPP)。直接使用
as
,带有
#
的行可能会被视为注释。


0
投票

我通过为汇编代码添加单独的库目标并将该库链接到最终的可执行文件解决了这个问题:

add_library(assembler_parts startup_stm32h743xx.s)
target_link_libraries(my_executable assembler_parts)

由于

assembler_parts
是不同的目标,因此它不共享目标特定选项,例如通过
target_compile_options(my_executable ...)
设置的。

© www.soinside.com 2019 - 2024. All rights reserved.