CMAKE与_GLIBCXX_USE_CXX11_ABI

本文解决了一个在CentOS上将GCC从4.8.5升级到5.4.0后遇到的编译问题,即_GLIBCXX_USE_CXX11_ABI不一致导致的错误。通过为CMake指定正确的GCC和G++版本,成功解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 背景

将centos上的gcc 4.8.5升级到gcc 5.4.0后编译程序出现问题,发现存在_GLIBCXX_USE_CXX11_ABI的问题,但是所有的代码使用的都是gcc 5.4.0,按照理论不应该出现这个问题。

2 解决方案

查看cmake发现,cmake使用的gcc的版本是5.4.0,但是使用的g++的版本却是4.8.5,后面通过强制指定g++编译器的版本解决该问题,也就是为cmake指定编译器,比如:

CC=gcc CXX=g++ cmake ..

为cmake指定编译器还有其余的方法:

第一种方法

对于简单的特别是自用的项目,可以通过设置CMakeList文件里的变量指定CMake使用的编译器,如:

set(CMAKE_C_COMPILER "/usr/bin/mygcc") set(CMAKE_CXX_COMPILER "/usr/bin/myg++")

第二种方法: 对于复杂的项目,执行CMake时可能还用到了include(GNUInstallDirs)、include(CheckCXXCompilerFlag)等指令,在文件里设定变量的方式就有些勉强了。这时有两种方案:

设定环境变量

export CC=`which mygcc`

export CXX=`which myg++`

使用CMake参数

cmake -DCMAKE_C_COMPILE=`which mygcc` -DCMAKE_CXX_COMPILER=`which myg++` 注意这两种情况下的“形参”并不相同。

见cmake wiki:FAQ · Wiki · CMake / Community · GitLab

### 解决方案 在处理 `-Wstrict-prototypes` 警告时,这是由于 GCC 编译器默认启用了该选项,而此选项仅适用于 C 和 Objective-C 语言,在 C++ 中并不适用。因此可以通过调整编译参数来禁用这一警告。 #### 方法一:修改 `setup.py` 或构建脚本 如果正在使用自定义的 PyTorch 扩展模块,则可以在调用 `setuptools` 构建工具时通过设置额外的编译标志移除该警告: ```python from setuptools import setup from torch.utils.cpp_extension import BuildExtension, CUDAExtension extra_compile_args = { 'cxx': ['-DUSE_CUDA', '-std=c++17', '-Wno-strict-prototypes'], # 移除-Wstrict-prototypes警告 } setup( name='custom_extension', ext_modules=[ CUDAExtension('custom_extension', [ 'src/custom_extension.cc', 'src/custom_kernel.cu' ], extra_compile_args=extra_compile_args), ], cmdclass={ 'build_ext': BuildExtension } ) ``` 上述代码片段展示了如何向 `extra_compile_args` 参数传递特定于 C++ 的编译选项以忽略不必要的警告[^1]。 #### 方法二:环境变量控制 另一种方法是在执行构建命令之前配置环境变量,从而全局影响 GCC 行为。例如,对于 Bash 用户来说,可以这样做: ```bash export CXXFLAGS="-Wno-strict-prototypes" ``` 这会告诉 GCC 不要应用严格原型检查规则给任何后续编译过程中的文件[^3]。 #### 方法三:CMakeLists.txt 配置 当采用 CMake 来管理项目依赖关系并生成 Makefile 文件时,也可以直接编辑项目的 `CMakeLists.txt` 并加入如下指令: ```cmake if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") add_definitions(-Wno-strict-prototypes) endif() ``` 这样做的目的是针对 GNU 工具链单独指定不启用严格的函数声明验证机制[^2]。 #### 总结 以上三种方式都可以有效消除因误配而导致的 cc1plus 提醒信息。推荐优先考虑第一种解决方案——即通过扩展模块本身的接口提供更精确的定制化支持;而对于那些完全基于外部库链接的应用场景则更适合选用第二种或者第三种策略之一完成相同目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值