<command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]

本文介绍了在Ubuntu 12.04 32位环境下编译Android 4.0.3包时遇到的_FORTIFY_SOURCE编译错误,并提供了详细的解决方案。通过修改源码目录下的HOST_linux-x86.mk文件,将HOST_GLOBAL_CFLAGS设置为HOST_GLOBAL_CFLAGS+=-U_FORTIFY_SOURCE-D_FORTIFY_SOURCE=0,可以解决该错误。

这两天在ubuntu12.04 32位上编译android4.0.3包,发现的如标题的错误。

错误打印如下:

host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp
<command-line>:0:0: error: "_FORTIFY_SOURCE" redefined [-Werror]
<built-in>:0:0: note: this is the location of the previous definition
cc1plus: all warnings being treated as errors
make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1

上网查了查,解决方法如下:

修改源码目录下/build/core/combo/HOST_linux-x86.mk文件:

将以下语句

HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0

修改为

HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0

ATTENTION:
There is a SPACE between the -U_FORTIFY_SOURCE and -D_FORTIFY_SOURCE

<think> 我们面对的问题是:在运行Fortify Static Code Analyzer的`sourceanalyzer.exe -b C:\Users\Administrator\Desktop\ICBC make`命令时,出现错误: `[error]: Duplicate occurrence of command line option "-b" (with argument "\Users\Administrator\Desktop\ICBC")` 这个错误提示表明,在命令行中重复使用了`-b`选项。根据Fortify Static Code Analyzer的使用规则,`-b`选项用于指定构建ID(build ID),且在同一个命令中只能出现一次。 ### 问题分析 1. **命令结构**:`sourceanalyzer.exe -b <build_id> <build_command>` - 其中`<build_id>`是用户为此次扫描指定的唯一标识符,`<build_command>`是构建项目的命令(例如`make`、`msbuild`等)。 2. **错误原因**:在同一个命令中出现了两次`-b`选项,导致解析失败。 ### 解决方案 #### 步骤1:检查命令是否包含重复的`-b`选项 - 用户执行的命令是:`sourceanalyzer.exe -b C:\Users\Administrator\Desktop\ICBC make` - 从表面看,这里只有一个`-b`选项。但请注意,如果环境变量或系统设置中已经预设了`-b`选项,或者`make`命令本身包含`-b`选项,则可能导致冲突。 #### 步骤2:检查环境变量 - 查看当前环境变量中是否设置了与Fortify相关的选项,特别是`SCA_BUILD_ID`或类似变量。因为这些环境变量可能会被`sourceanalyzer`自动读取,相当于隐式添加了`-b`选项。 - 解决办法:临时清除相关环境变量。 - 在Windows命令提示符中: ```cmd set SCA_BUILD_ID= ``` - 或者在PowerShell中: ```powershell $env:SCA_BUILD_ID = $null ``` #### 步骤3:检查`make`命令是否包含`-b`选项 - 有些构建工具(如make)支持`-b`选项(例如,GNU make的`-b`选项用于忽略平台兼容性)。如果`make`命令使用了`-b`,那么整个命令就变成了: ```bash sourceanalyzer.exe -b C:\Users\Administrator\Desktop\ICBC make -b ... ``` 这会导致Fortify解析到两个`-b`选项(一个来自`sourceanalyzer`,一个来自`make`)。 - 解决办法:将`make`命令用引号括起来,使其作为一个整体传递: ```bash sourceanalyzer.exe -b C:\Users\Administrator\Desktop\ICBC "make" ``` 或者,如果`make`命令有参数,可以使用: ```bash sourceanalyzer.exe -b C:\Users\Administrator\Desktop\ICBC "make [other_args]" ``` #### 步骤4:使用转义字符 - 如果上述方法无效,尝试对`make`命令中的`-b`选项进行转义,例如在`-b`前面加上`^`(Windows)或`\`(Linux/macOS): ```bash sourceanalyzer.exe -b C:\Users\Administrator\Desktop\ICBC make ^-b ... ``` #### 步骤5:简化构建路径 - 构建ID(`-b`后面的参数)建议使用简单的字符串(不含空格和特殊字符),避免使用长路径。可以尝试将构建ID改为一个简单的名称,例如: ```bash sourceanalyzer.exe -b ICBC make ``` #### 步骤6:检查Fortify版本 - 旧版本的Fortify可能存在解析bug。请确保使用最新版本或受支持的版本。可以通过以下命令查看版本: ```bash sourceanalyzer -version ``` ### 验证操作 重新运行命令(采用步骤3的引号方式): ```bash sourceanalyzer.exe -b ICBC "make" ``` ### 常见错误总结 | 原因 | 解决方案 | |------|----------| | 环境变量冲突 | 清除`SCA_BUILD_ID`等环境变量 | | 构建命令包含`-b` | 用引号包裹构建命令 | | 构建ID含特殊字符 | 使用简单构建ID(如`ICBC`) | | Fortify版本过低 | 升级Fortify SCA | > 注意:如果问题仍未解决,可以尝试使用`-verbose`选项获取更多调试信息: > ```bash > sourceanalyzer.exe -b ICBC -verbose "make" > ``` §§相关问题§§ 1. Fortify SCA如何设置构建ID的存储位置? 2. 如何解决Fortify扫描过程中的内存溢出问题? 3. Fortify SCA支持哪些构建工具? 4. 如何将Fortify SCA集成到持续集成(CI)流程中? </think> ### Fortify SCA 命令行"Duplicate -b"错误解决方案 您遇到的错误是因为命令行中重复使用了 `-b` 选项。以下是系统化解决方案: #### 一、核心修复步骤 1. **检查命令格式** ```bash # 错误格式(重复 -b) sourceanalyzer.exe -b C:\Users\Administrator\Desktop\ICBC -b make # 正确格式(单 -b 选项) sourceanalyzer.exe -b "ICBC" make ``` 构建ID(`ICBC`)必须是**唯一标识符**而非路径,路径应在`make`命令中指定。 2. **验证环境变量** 检查是否通过环境变量预设了`-b`参数: ```bash # 清除可能冲突的环境变量 unset SCA_BUILD_ID unset FORTIFY_BUILD_ID ``` 3. **使用简化路径** 避免长路径导致的解析错误: ```bash cd C:\Users\Administrator\Desktop sourceanalyzer.exe -b ICBC make ``` #### 二、错误原因分析 | 错误类型 | 检测方法 | 解决方案 | |---------|----------|---------| | 选项重复 | 检查命令历史 | 删除额外`-b`选项 | | 路径冲突 | 检查路径含空格 | 用引号包裹路径`"C:\Path With Spaces"` | | 环境污染 | 执行`set | grep FORTIFY` | 重置环境变量 | | 版本不兼容 | `sourceanalyzer -v` | 升级至[最新版本](https://www.microfocus.com/fortify) #### 三、备用解决方案 1. **使用配置文件替代命令行** 创建`fortify.properties`: ```properties build.id = ICBC build.command = make ``` 执行: ```bash sourceanalyzer @fortify.properties ``` 2. **转义特殊字符** Windows路径需双重转义: ```bash sourceanalyzer.exe -b ICBC make -f C:\\\\Users\\\\Administrator\\\\Desktop\\\\ICBC ``` 3. **调试模式检测** 添加`-debug`选项查看详细解析过程: ```bash sourceanalyzer.exe -debug -b ICBC make ``` 检查输出中是否出现重复参数解析。 > **关键提示**:构建ID长度应≤64字符且不含特殊符号`!@#$%^&*`[^1]。若问题持续,尝试重启Fortify服务: > ```bash > fortifyclean.cmd # 清除缓存 > scanserver -shutdown # 重启服务 > ``` #### 四、操作验证 执行最小化测试命令: ```bash sourceanalyzer.exe -b TestBuild echo "Build successful" ``` 成功输出应包含: ``` [info]: Build ID 'TestBuild' registered [info]: Executing: echo "Build successful" ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值