GCC 9.4 编译error: catching polymorphic type ‘class std::bad_alloc’ by value [-Werror=catch-value=]

环境

lm@lm:~$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal



lm@lm:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
<think>嗯,用户遇到了一个编译器错误:-Werror=date-time,导致gcc的cc1报错,提示没有选项Wdate-time。我需要先理解这个错误的原因。通常,-Werror=... 会把特定的警告转换为错误。所以-Werror=date-time应该是将date-time警告视为错误,但如果编译器不支持这个选项,就会报错。 首先,可能用户在编译时,构建脚本或Makefile中设置了-Werror=date-time这个编译选项。而使用的gcc版本可能不支持-Wdate-time这个警告选项,所以当启用-Werror=date-time时,编译器找不到对应的选项,从而报错。 接下来,我需要考虑可能的解决方案。第一个办法是检查gcc的版本,看看是否支持这个选项。如果gcc版本较旧,可能确实没有这个警告选项。这时候,用户需要升级gcc或者移除这个编译选项。 另一个办法是查找项目中哪里启用了这个选项。可能是在CMakeLists.txt或者其他构建配置文件中。用户需要找到并删除或注释掉相关部分,比如类似add_compile_options(-Werror=date-time)的语句。 另外,用户可能想要保留其他-Werror选项,但只是禁用date-time相关的。这时候,可以单独移除-Werror=date-time,同时保留其他-Werror的设置。或者,如果项目使用autotools,可能需要修改configure.ac或Makefile.am中的编译标志。 还可能存在环境变量中设置了额外的编译选项,比如CFLAGS或CXXFLAGS,需要检查这些变量是否包含-Werror=date-time,并清除掉。 最后,建议用户在修改后重新配置和编译项目,确保问题解决。同时提醒在嵌入式开发中,编译器选项的兼容性很重要,需根据平台调整参数。 需要验证这些步骤是否正确,比如升级gcc是否真的支持该选项,或者是否有其他替代方法。另外,用户提到的参考引用[1]中提到了在嵌入式平台上的编译问题,可能和交叉编译环境有关,需要考虑交叉编译器是否支持该选项,但用户的问题看起来是本地编译,所以可能不需要涉及交叉编译的复杂性。</think>### 解决GCC编译错误`-Werror=date-time` #### 问题分析 `-Werror=date-time` 是GCC编译器的一个编译选项,它会将 `-Wdate-time` 警告(检测到代码中使用 `__DATE__` 或 `__TIME__` 宏)转换为错误。若编译器版本不支持该选项,或编译脚本错误启用此选项,会导致报错: ```bash cc1: error: -Werror=date-time: no option -Wdate-time ``` #### 解决方法 1. **检查GCC版本** 低版本GCC(如低于4.9)可能不支持 `-Wdate-time`。通过以下命令升级GCC: ```bash sudo apt-get update && sudo apt-get install gcc g++ ``` 2. **移除编译选项** 在项目的构建配置文件中(如 `CMakeLists.txt` 或 `Makefile`),删除或注释包含 `-Werror=date-time` 的语句。例如: ```cmake # 修改前 add_compile_options(-Werror=date-time) # 修改后 # add_compile_options(-Werror=date-time) ``` 3. **保留其他`-Werror`选项** 若需保留其他警告转错误的功能,可单独移除 `-Werror=date-time`: ```cmake # 仅移除date-time相关选项 add_compile_options(-Werror -Wno-error=date-time) ``` 4. **检查环境变量** 确保环境变量(如 `CFLAGS`、`CXXFLAGS`)未包含 `-Werror=date-time`: ```bash unset CFLAGS unset CXXFLAGS ``` 5. **重新配置并编译** 清理构建目录后重新编译: ```bash make clean && make ``` #### 嵌入式开发注意事项 在嵌入式平台(如ARM64编译时,需确保交叉编译工具链支持相关选项。若问题持续,建议检查工具链版本与文档[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值