linux 查看gcc安装目录,如何查看和修改gcc/g++默认include路径

一、如何查看gcc/g++默认include路径

安装gcc:yum install gcc

安装g++:yum install gcc-c++

1、查看gcc的include路径命令:

`gcc -print-prog-name=cc1` -v

`g++ -print-prog-name=cc1` -v

2、查看g++的include路径命令:

`gcc -print-prog-name=cc1plus` -v

`g++ -print-prog-name=cc1plus` -v

CentOS release 6.4 (Final)下面执行:

[root@ebs-19233 ~]# `gcc -print-prog-name=cc1` -v

忽略不存在的目录“/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include-fixed”

忽略不存在的目录“/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/include”

#include "..." 搜索从这里开始:

#include <...> 搜索从这里开始:

/tmp

/usr/local/include

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include

/usr/include

搜索列表结束。

CentOS release 6.4 (Final)下面执行:

[root@ebs-19233 ~]# `gcc -print-prog-name=cc1plus` -v

忽略不存在的目录“/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include-fixed”

忽略不存在的目录“/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../x86_64-redhat-linux/include”

#include "..." 搜索从这里开始:

#include <...> 搜索从这里开始:

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/x86_64-redhat-linux

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/backward

/usr/local/include

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include

/usr/include

搜索列表结束。

即默认include路径如下,可以看出/usr/local/include的优先级高于/usr/include:

/usr/include/c++/4.4.7

/usr/include/c++/4.4.7/x86_64-redhat-linux

/usr/include/c++/4.4.7/backward

/usr/local/include

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/include

/usr/include

二、如何添加gcc/g++默认include路径(用户添加的路径优先级最高)

方法1:通过环境变量添加

对于C语言:

C_INCLUDE_PATH=/usr/include:/usr/local/include:/tmp

export C_INCLUDE_PATH

对于C++语言:

CPLUS_INCLUDE_PATH=/usr/include:/usr/local/include:/tmp

export CPLUS_INCLUDE_PATH

CPATH环境变量同时支持C语言和C++语言,并且优先级高于以上2个环境变量。

方法2:通过命令行添加

使用命令行添加,home优先于tmp:

gcc -I/home -I/tmp main.c

g++ -I/home -I/tmp main.cpp

你提供的这段脚本是一个非常典型的 **在 Ubuntu 系统中切换 GCC 编译器版本** 的操作,目的是为了使用更兼容的旧版编译器(`gcc-4.8`)来构建对现代编译器不友好的项目(如老旧嵌入式 SDK、Linux 内核 4.19 或 BCM63xx 平台固件等)。 下面我将逐行解释其作用,并说明为什么这样做可以解决你之前遇到的 `__has_include` 错误问题。 --- ## ✅ 脚本详解 ```bash # 使用兼容性更好的旧版编译器(Ubuntu 14.04 LTS 默认gcc版本) sudo apt install gcc-4.8 g++-4.8 ``` ### 🔍 解释: - 安装 `gcc-4.8` `g++-4.8`。 - `gcc-4.8` 是一个经典且广泛用于嵌入式开发的编译器版本,支持 C11、C++11 基本特性,但 **不会启用过于严格的现代检查规则**。 - 很多老项目(尤其是 Broadcom 的闭源 SDK)都是基于这个时期的工具链设计的,用新版 GCC(如 7+)容易触发语法错误或警告升级为错误。 > ⚠️ 注意:Ubuntu 20.04+ 默认不再提供 `gcc-4.8`,需手动添加旧仓库或下载离线包。 --- ```bash sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 40 ``` ### 🔍 解释: - 将系统中多个 `gcc` 版本注册到 `update-alternatives` 框架中。 - 设置两个候选项: - `/usr/bin/gcc-4.8` 权重 `50` - `/usr/bin/gcc-7` 权重 `40` - 权重越高,优先级越高。系统默认选择权重最高的版本作为当前 `gcc` 命令指向。 ✅ 效果:运行 `gcc --version` 会显示 `gcc-4.8` --- ```bash sudo update-alternatives --install /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-4.8 50 sudo update-alternatives --install /usr/bin/gcc-ar gcc-ar /usr/bin/gcc-ar-7 40 ``` ### 🔍 解释: - `gcc-ar` 是 GNU Binutils 中用于处理归档文件(`.a` 静态库)的增强版 `ar` 工具,与 LTO(Link Time Optimization)相关。 - 必须与主 `gcc` 版本一致,否则链接时可能报错: ``` error: ar does not support --plugin option ``` 所以这里也绑定 `gcc-ar-4.8` 为主版本。 --- ```bash sudo update-alternatives --install /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-4.8 50 sudo update-alternatives --install /usr/bin/gcc-nm gcc-nm /usr/bin/gcc-nm-7 40 ``` - `gcc-nm`:包装了 `nm` 工具,用于符号表查看,配合特定编译器插件使用。 --- ```bash sudo update-alternatives --install /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-4.8 50 sudo update-alternatives --install /usr/bin/gcc-ranlib gcc-ranlib /usr/bin/gcc-ranlib-7 40 ``` - `gcc-ranlib`:增强版 `ranlib`,用于生成静态库索引,也需要匹配编译器插件。 --- ```bash sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 40 ``` - 同样为 C++ 编译器设置替代方案,确保 `g++` 命令也指向 `g++-4.8`。 --- ## 🛠️ 如何验证是否生效? 执行以下命令: ```bash gcc --version g++ --version gcc-ar --version gcc-nm --version gcc-ranlib --version ``` 你应该看到输出都来自 **GCC 4.8.x**。 --- ## ✅ 为什么这能修复 `__has_include` 错误? ### ❓ 回顾错误: ```c (__has_include); // error: "__has_include" used outside of preprocessing directive ``` ### 💡 原因分析: - 新版 GCC(≥ 5.x)增强了对 `_Static_assert`, `__has_attribute`, `__has_include` 等特性的支持检测机制。 - 构建系统可能会生成测试代码探测这些特性是否存在。 - 但在某些老内核补丁或 Makefile 中,探测逻辑写得不严谨,导致生成非法语法。 - **而 GCC-4.8 根本不认识 `__has_include`**,所以在预处理器阶段直接忽略它,反而“绕过”了这个问题! > 🧠 实际上是:“因为太老而不报错”,变成了一种“兼容性优势”。 --- ## ✅ 更优做法(推荐) 与其全局切换系统编译器(可能影响其他项目),不如 **局部指定编译器路径**: ```bash make PRODUCT_NAME=be900v2 sdk WLTEST=1 \ HOSTCC=gcc-4.8 \ CC=/opt/toolchain/arm-bcm-4.9/bin/arm-linux-gnueabihf-gcc \ AR=/opt/toolchain/arm-bcm-4.9/bin/arm-linux-gnueabihf-ar \ 2>&1 | tee be900v2_1.log ``` 这样既不影响主机环境,又能精准控制交叉编译工具链。 --- ## 📌 补充建议 | 建议 | 说明 | |------|------| | ✅ 使用 Docker 构建环境 | 如 `ubuntu:14.04` 容器内原生带 gcc-4.8,避免污染主机 | | ✅ 备份原始配置 | 在修改 `update-alternatives` 前记录当前状态 | | ✅ 不要混用不同版本的 binutils | `ld`, `ar`, `objcopy` 等应与工具链配套 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值