gcc和arm-linux-gcc 头文件寻找路径【转】

本文详细介绍了在Linux环境下,不同类型的程序(如应用程序、内核相关程序)在编译过程中,默认搜索头文件的具体路径,包括GCC编译器及交叉编译器的默认头文件路径。

原文地址:http://blog.chinaunix.net/uid-29145190-id-3867605.html

在LINUX程序设计当中,经常会遇到头文件包含的问题,那么这些头文件到底在哪个路径下?具体的头文件路径依赖于程序性质(应用程序还是和内核相关的程序)和编译器,下面分别叙述。

机器环境如下:UBUNTU10.04LTS,自己另外安装的LINUX内核源码目录为/usr/src/kernel,交叉链接器arm-linux-gcc安装目录为/usr/lcoal/arm/2.95.3/

【1.如果是应用程序,并且使用GCC进行普通编译】,如果编译时没有使用-I选项指定包含目录的话,那么默认的头文件目录在/usr/include下,可以在shell下输入如下命令

echo 'main(){}'|gcc -E -v -

看到如下输出内容

Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=i486'
/usr/lib/gcc/i486-linux-gnu/4.4.3/cc1 -E -quiet -v - -D_FORTIFY_SOURCE=2 -mtune=generic -march=i486 -fstack-protector
ignoring nonexistent directory "/usr/local/include/i486-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../i486-linux-gnu/include"
ignoring nonexistent directory "/usr/include/i486-linux-gnu"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
/usr/include
End of search list.
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "<stdin>"
main(){}
COMPILER_PATH=/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/4.4.3/:/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/i486-linux-gnu/4.4.3/../../../:/lib/:/usr/lib/:/usr/lib/i486-linux-gnu/
COLLECT_GCC_OPTIONS='-E' '-v' '-mtune=generic' '-march=i486'

这就是内定的include文件搜索路径

#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include
/usr/lib/gcc/i486-linux-gnu/4.4.3/include-fixed
/usr/include
End of search list.

实际上,这些内定的include文件搜索路径,是存放在specs文件中

【2.如果是应用程序,采用交叉编译】,编译时没有使用-I选项指定包含目录的话,那么默认的头文件搜索路径为/usr/local/arm/2.95.3/arm-linux/include,即交叉编译器的安装目录下的include目录,执行如下命令

echo 'main(){}'|arm-linux-gcc -E -v -

看到如下输出内容

Reading specs from /usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/specs
gcc version 2.95.3 20010315 (release)
/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/cpp0 -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -Dunix -D__arm__ -Dlinux -D__ELF__ -D__unix__ -D__arm__ -D__linux__ -D__ELF__ -D__unix -D__linux -Asystem(unix) -Asystem(posix) -Acpu(arm) -Amachine(arm) -D__CHAR_UNSIGNED__ -D__ARM_ARCH_3__ -D__APCS_32__ -
GNU CPP version 2.95.3 20010315 (release) (ARM GNU/Linux with ELF)
#include "..." search starts here:
#include <...> search starts here:
/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/include
/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/sys-include
/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/include
End of search list.
The following default directories have been omitted from the search path:
/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../include/g++-3
End of omitted list.
# 1 ""
main(){}

这就是内定的include文件搜索路径

#include "..." search starts here:
#include <...> search starts here:
/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/include
/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/sys-include
/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3/../../../../arm-linux/include
End of search list.

即在采用交叉编译时,应用程序所包含的头文件是在交叉编译器的安装目录下。

【3.如果是和内核相关的程序】,比如驱动程序,那么所包含的头文件是在内核源码的安装目录下,即/usr/src/kernel/include,这时一般要在Makefile文件中指定内核源码目录,在编译时指定INCLUDE目录,可参考“http://blogold.chinaunix.net/u3/119151/showart_2342316.html文章中Makefile文件内容


【4.总结】:

nclude的header文件,连结数据库,系统定义,总共有下列来源指定编译器去那找。
当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib() ,写在specs内的 
后来用-D -I -L指定的 
gcc环境变量设定(编译的时候) 
ld.so的环境变量(这是run time的时候)

转载于:https://www.cnblogs.com/pang1567/p/3606353.html

<think> 嗯,用户询问的是两款ARM交叉编译器的区别:arm-buildroot-linux-gnueabihf-gccarm-linux-gnueabihf-gcc。这两者名称确实很相似,容易让人混淆。 从引用[1]的信息来看,关键线索在于"gnueabihf"后缀表示支持硬浮点运算模式,这是两者共同的特性。引用[2][3][4]都提到了buildroot这个关键词,说明其中一款编译器与嵌入式构建系统有关。 仔细分析命名结构发现:arm-buildroot-linux-gnueabihf-gcc明显包含了"buildroot"字样,而arm-linux-gnueabihf-gcc则没有。这暗示着前者是特定开发环境定制的产物。考虑到引用[4]描述的配置问题,这类编译器通常伴随嵌入式Linux构建系统生成。 用户可能正在配置嵌入式开发环境,遇到工具链识别问题。需要解释清楚:buildroot版本是自定义工具链,而标准版本是通用发行版提供的。两者的指令集兼容性其实相同,区别在于库路径配置细节。 用户深层需求应该是想确认能否互换使用,或者解决环境配置报错。需要强调路径配置的重要性,引用[3][4]的报错案例正好说明这点。可以建议用户通过-v参数验证工具链完整性,就像引用[2]演示的那样。 </think> 根据引用内容交叉编译器命名规范,`arm-buildroot-linux-gnueabihf-gcc` 与 `arm-linux-gnueabihf-gcc` 的核心区别在于**工具链来源目标平台定制化程度**: ### 主要区别分析 1. **来源差异** - `arm-linux-gnueabihf-gcc`:通用型工具链 由主流发行版(如Debian/Ubuntu)官方提供,对应 `gcc-arm-linux-gnueabihf` 软件包[^1],支持标准ARM硬浮点架构(`armhf`)。 - `arm-buildroot-linux-gnueabihf-gcc`:专用定制工具链 由 **Buildroot嵌入式构建系统** 生成,名称中的 `buildroot` 表明其来源[^3][^4]。专为特定嵌入式设备定制(如引用[4]中的i.MX6ULL开发板)。 2. **配置差异** ```diff + arm-buildroot-linux-gnueabihf-gcc - 包含定制化C库路径(如uClibc/glibc版本) - 内核头文件匹配特定Linux版本 - 针对目标板优化编译参数 + arm-linux-gnueabihf-gcc - 使用发行版标准库路径 - 通用内核头文件兼容 ``` 引用[3]的报错 `Command not found` 正是因未正确配置Buildroot工具链路径所致。 3. **应用场景** - `arm-buildroot-*`:嵌入式开发 需与Buildroot工程配套使用(如引用[4]的SDK),直接调用可能因路径问题失败[^4]。 - `arm-linux-*`:通用开发 通过 `sudo apt install gcc-arm-linux-gnueabihf` 安装即可全局使用[^1]。 ### 功能相似性 二者均支持: ✔️ ARMv7及以上架构 ✔️ 硬浮点运算(`hf` = hard float) ✔️ GNU EABI接口规范(`gnueabihf`) ✔️ Linux目标系统(引用[1]明确两者的浮点处理策略相同) ### 使用建议 1. **嵌入式开发** 使用 `arm-buildroot-*` 并配置环境变量: ```bash export PATH=/path/to/buildroot/output/host/bin:$PATH ``` 验证安装:`arm-buildroot-linux-gnueabihf-gcc -v`[^2] 2. **通用开发** 直接安装标准版: ```bash sudo apt update sudo apt install gcc-arm-linux-gnueabihf ``` > ⚠️ 关键提示:若使用Buildroot定制工具链,必须确保: > - SDK路径正确(引用[4]的报错源于路径缺失) > - 与目标设备内核版本匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值