linux内核编译错误:error: read-only variable '__r2' used as 'asm' output

本文介绍了一种常见的Linux内核编译错误:使用只读变量作为'asm'输出的情况,并提供了有效的解决方案,建议使用较低版本的交叉编译器。
linux内核编译错误:error: read-only variable '__r2' used as 'asm' output
内核版本:2.6.14
交叉编译器:arm-linux-gcc 4.3.3
错误:
arch/arm/mm/alignment.c: In function 'proc_alignment_write':
arch/arm/mm/alignment.c:119: error: read-only variable '__r2' used as 'asm' output
arch/arm/mm/alignment.c:119: error: read-only variable '__r2' used as 'asm' output
arch/arm/mm/alignment.c:119: error: read-only variable '__r2' used as 'asm' output
arch/arm/mm/alignment.c:119: error: read-only variable '__r2' used as 'asm' output
make[1]: *** [arch/arm/mm/alignment.o] 错误 1
make: *** [arch/arm/mm] 错误 2
解决办法:选择较低版本的交叉编译器,比如3.4.1。
<think>我们正在讨论CMake生成器表达式:`$<$<COMPILE_LANGUAGE:ASM>:--gnu_asm>` 这个表达式是一个生成器表达式,用于条件性地添加编译选项。 分解: 1. 最外层:`$<condition:value>` 是一个条件表达式,当条件为真时,整个表达式等于value,否则为空。 2. 内层:`$<COMPILE_LANGUAGE:ASM>` 是一个生成器表达式,用于检测当前正在编译的源文件的编译语言是否为ASM(汇编语言)。 3. 因此,整个表达式的含义是:如果当前源文件的编译语言是汇编语言(ASM),那么生成选项`--gnu_asm`,否则不生成任何内容。 用途: 这个表达式通常用于`target_compile_options`命令中,为汇编文件指定特定的编译选项。 例如,在跨平台开发中,针对不同的汇编器(如GNU汇编器),可能需要传递特定的选项。 示例: 假设我们有一个目标(target),其中包含C、C++和汇编源文件。我们只想在编译汇编文件时添加`--gnu_asm`选项,可以这样写: ```cmake target_compile_options(my_target PRIVATE $<$<COMPILE_LANGUAGE:ASM>:--gnu_asm> ) ``` 这样,当编译器处理汇编源文件时,会自动添加`--gnu_asm`选项;处理其他语言(如C或C++)时,则不会添加。 注意: 生成器表达式在CMake生成构建系统时进行求值,因此它能够根据上下文(如源文件的语言)动态地设置选项。 引用: 在之前的讨论中,我们看到在`project`命令中可以指定语言(包括ASM)[^1]。另外,在设置编译选项时,我们有时需要为不同语言设置不同的选项,这时生成器表达式就非常有用。 相关问题: 1. CMake中的生成器表达式还有哪些常见的用法? 2. 如何为不同的编译器(如GCC和Clang)设置不同的编译选项? 3. 在CMake中如何为特定源文件指定编译选项? 4. 如何检测CMake当前支持的编译语言? </think>### `$<$<COMPILE_LANGUAGE:ASM>:--gnu_asm>` 的含义与用途 在 CMake 中,`$<$<COMPILE_LANGUAGE:ASM>:--gnu_asm>` 是一个**生成器表达式**,用于根据源文件的编译语言条件性地添加编译选项。其结构分解如下: 1. **外层结构**:`$<条件:值>` - 这是 CMake 的条件表达式语法,当条件为真时返回指定值,否则返回空字符串[^2]。 2. **内层条件**:`$<COMPILE_LANGUAGE:ASM>` - 检测当前处理的源文件是否为汇编语言(ASM)文件 - 是汇编文件 → 返回 `TRUE` - 非汇编文件(如 C/C++)→ 返回 `FALSE` 3. **最终逻辑**: ```cmake if (当前文件是汇编文件) 添加 "--gnu_asm" 编译选项 else 不添加任何选项 ``` --- ### 主要用途 1. **为汇编文件指定专用选项** 当项目中混合使用 C/C++ 和汇编文件时,为汇编文件单独设置 GNU 汇编器特有的编译选项: ```cmake target_compile_options(my_target PRIVATE $<$<COMPILE_LANGUAGE:CXX>:-Wall> # C++文件加-Wall $<$<COMPILE_LANGUAGE:ASM>:--gnu_asm> # ASM文件加--gnu_asm ) ``` 2. **解决跨平台汇编兼容性问题** 不同汇编器(如 GNU as 与 NASM)选项语法不同,此表达式确保: ```cmake # ARM 汇编器用 --arm_asm,GNU 汇编器用 --gnu_asm $<$<COMPILE_LANGUAGE:ASM>:$<IF:$<C_COMPILER_ID:GNU>,--gnu_asm,--arm_asm>> ``` 3. **优化编译过程** 避免将汇编选项错误应用到 C/C++ 文件,减少编译警告或错误[^5]。 --- ### 实际应用示例 在嵌入式开发中使用 ARM 汇编时(参考引用[5]环境): ```cmake add_executable(firmware main.c # C 文件 startup.s # ARM 汇编文件 ) # 为汇编文件启用 GNU 汇编器扩展语法 target_compile_options(firmware PRIVATE $<$<COMPILE_LANGUAGE:ASM>:-mthumb --gnu_asm> ) ``` 效果: - 编译 `startup.s` 时:添加 `-mthumb --gnu_asm` 选项 - 编译 `main.c` 时:不添加额外选项 --- ### 关键特性 | 特性 | 说明 | |------|------| | **条件精确性** | 精确匹配源文件语言类型[^1] | | **作用域安全** | 仅对目标(target)内指定文件生效 | | **动态评估** | 在生成构建系统时解析(非配置阶段) | | **链式组合** | 可嵌套其他生成器表达式(如 `$<IF:...>`) | --- ### 典型场景 1. **嵌入式开发** 为 bootloader 汇编代码启用处理器特定指令集: ```cmake $<$<COMPILE_LANGUAGE:ASM>:-mcpu=cortex-m7> ``` 2. **高性能计算** 为 SIMD 汇编例程添加优化指令: ```cmake $<$<COMPILE_LANGUAGE:ASM>:-mavx512f> ``` 3. **操作系统内核** 区分 x86 和 ARM 汇编语法: ```cmake $<$<COMPILE_LANGUAGE:ASM>:$<IF:$<TARGET_PROPERTY:ARCH,x86>,-masm=intel,--gnu_asm>> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值