对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置、连接库位置等),然后生成Makefile以编译程序。可以进入该软件的目录,执行"./configure --help"命令查看使用帮。

一个程序能正确编译、链接、运行需要满足3个条件:预处理时能找到头文件,连接时能找到库(静态库或动态库),运行时能找到库。下面介绍头文件的搜索路径

GCC 搜索头文件有三种策略:

1.内定搜索目录,这是编译器自身预设的目录。由于是内定的,一定会搜索,所以总是最后才搜索。

2.手动指定搜索目录。可以在执行配置命令configure前,通过环境变量C_INCLUDE_PATH进行设定;也可以在执行配置命令configure时,通过-I选项进行指定。

3.手动指定不进行搜索的目录。这是在执行配置命令时,使用-nostdin选项进行指定。

-nostdinc选项

使编译器不在系统缺省的头文件目录里面找头文件,一般和 -I 联合使用,明确限定头文件的位置。

-nostdin C++选项

规定不在 g++ 指定的标准路经中搜索,但仍在其他路径中搜索。此选项 在创libg++库使用

GCC指定头文件的方式

在程序中,常用两种方法来包含头文件:

#include <headerfile.h> 
#include "headerfile.h"

当#include <headerfile.h> 时,编译时按照"编译命令指定目录--->--->系统预设目录--->编译器预设"的顺序搜索头文件。

当#include "headerfile.h",编译时按照"源文件当前目录---->编译命令指定目录--->系统预设目录--->编译器预设"的顺序搜索头文件。

编译命令指定目录

"指定的"头文件目录是编译程序时使用" -I "选项来指定目录。举个例子:

mkdir -p /work/AAA/include /*临时目录,测试用*/
mkdir -p /work/BBB/include /*临时目录,测试用*/ export C_INCLUDE_PATH=/work/AAA/include echo 'main() {}' | arm-linux-gcc -I/work/BBB/include -E -v -

得到以下输出内容,从中可以看到查找头文件时的路径及优先顺序:

...
#include "....." search starts here:
#include <.....> search starts here: /work/BBB/include
/work/AAA/include ...

系统预设目录

系统预设的头文件目录是通过环境变量C_INCLUDE_PATH来设置的,这个变量的值要在执行配置命令configure之前设置。

编译器预设目录

编译器预设目录由编译器自己决定的,由程序代码决定的,这是不需要工人设置或指定的。

可以总结出头文件的查找路径及优先顺序:

1.如果源文件中使用双引号来包含头文件,则首先在源文件当前目录查找头文件。 
2.如果编译时使用"-I/some/dir",则在/some/dir中查找。

3.如果设置了环境变量C_INCLUDE_PATH,则在指定的目录中查找。

4.最后在编译器预设的路径中查找,这是不需要指定的,编译时一定会在该路径中搜索所需的头文件。

所以,编译程序时如果出现了找不到头文件的错误,可以通过设置C_INCLUDE_PATH或给编译器设置"-I"选线来指定头文件目录,这可以在执行配置命令configure之前设置C_INCLUDE_PATH或CFLAGS,如果不设置CFLAGS,它的默认值为"-g -O2",比如:

export C_INCLUDE_PATH="/some/dir/1:/some/dir/2"

export CFLAGS = "-g -O2 -I/some/dir" #如果设置了C_INCLUDE_PATH,就可以不设置CFLAGS

./configure

还有更好的方法,当明确知道要使用哪个动态库时,可以通过pkg-config命令获知要使用这个库时编译时的参数、连接时的参数。

先执行一下命令体验一下:

export PKG_CONFIG_PATH=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/pkgconfig

pkg-config --cflags uuid -I/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include

.头文件搜索路径

gcc 在编译时如何去寻找所需要的头文件 :

-I选项指定的目录--->gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH--->再找编译器内定目录

如果装gcc的时候,是有给定的prefix的话,那么就是

/usr/include

prefix/include

prefix/xxx-xxx-xxx-gnulibc/include

prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

Linux下的头文件搜索路径的更多相关文章

  1. Linux C语言头文件搜索路径

    本文介绍在linux中头文件的搜索路径,也就是说你通过include指定的头文件,linux下的gcc编译器它是怎么找到它的呢.在此之前,先了解一个基本概念. 头文件是一种文本文件,使用文本编辑器将代 ...

  2. Linux下包含头文件的路径问题与动态库链接路径问题

    C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路径. [1 ...

  3. Linux下的库文件搜索路径

        对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本configure,它的作用确定编译参数(比如头文件位置.连接库位置等),然后生成Makefile以编译程序.可以进入该软件的目录,执行 ...

  4. Linux 中C/C++ search path(头文件搜索路径)

    https://blog.csdn.net/BjarneCpp/article/details/76135980 起因 我拿到了一套Linux下的C++代码,代码中有这个头文件#include < ...

  5. Xcode增加头文件搜索路径的方法

    Xcode增加头文件搜索路径的方法 以C++工程为例: 在Build Settings 页面中的Search Paths一节就是用来设置头文件路径. 相关的配置项用红框框起来了,共有三个配置项: He ...

  6. linux下编译时的默认库和头文件搜索路径

    链接库路径 默认的链接库路径,定义在搜索/etc/ld.so.conf下的一些路径,其包含了一些重要的系统位置:LIBRARY_PATH, 但如果定义了LD_LIBRARY_PATH, 动态库的搜索路 ...

  7. eclipse C开发添加自己的头文件搜索路径

    eclipse编译C程序时提示: ..\src\main.c:8:21: fatal error: my_type.h: No such file or directory 如图: 需要添加自己的头文 ...

  8. linux下的.ssh文件夹路径等

    1.linux下的.ssh文件夹在~下,直接cd ~/.ssh即可 2.tp经过gd类处理过的水印图片格式为png 3.前端扒下别人家的网站如果自己本地打开有出现相同的代码段则有可能是js动态添加的, ...

  9. linux下的头文件和库文件搜索路径 (转)

     GCC 找头文件有三种策略: 1. 会在默认情况下指定到 /usr/include 文件夹 ( 更深层次的是一个相对路径, GCC 可执行程序的路径是 /usr/bin ,那么它在实际工作时指定头文 ...

随机推荐

  1. C-LODOP的端口和网站的端口

    c-lodop的端口和网站的端口是不同的,不需要修改自己网站的端口.c-lodop32位标准版端口:8000,18000 (http网站)c-lodop32扩展版端口:8000,18000(http网 ...

  2. ThreadingTCPServer源码解析

    实例 #!/usr/bin/env python #-*- coding:utf-8 -*- import SocketServer class Myserver(SocketServer.BaseR ...

  3. 微信小程序 左右联动菜单

    根据左侧列表,联动跳右侧内容. 效果如图: wxml代码: <view class="page"> <!-- 左侧导航 --> <view class ...

  4. Bootstrap, 模态框实现值传递,自动勾选

    目录 Bootstrap,模态框自动勾选,值传递 1.父页面 2. 子页面(modal) 模态框 Bootstrap,模态框自动勾选,值传递 场景: ​ 有一个这样的需求, 在父页面有一个table, ...

  5. .Net WebApi接口之Swagger UI 隐藏指定接口类或方法

    swagger的一个最大的优点是能实时同步api与文档,但有些时候我们不想全部公开接口,而要隐藏或屏蔽一些接口类或方法,swagger也是支持的,只需要设置一下DocumentFilter方法. 第一 ...

  6. jqGrid清空表格

    $("#jqGrid").jqGrid("setGridParam",{ datatype:'local', data : [], page:1 }).trig ...

  7. Reactor系列(五)map映射

    #java# #reactor# #flux# #map# #映射# 视频解视: https://www.bilibili.com/video/av79179444/ FluxMonoTestCase ...

  8. mysql插入中文数据变成问号怎么处理

    插入中文数据变成问号,一般都是因为字符集没有设置成utf8的原因 1.修改字符集: ALTER TABLE 表名 MODIFY 列名 类型(50) CHARACTER SET "utf8&q ...

  9. 关于springboot的日志logging.file和logging.path的配置问题

    springboot日志配置 logging.path  logging.file 它们俩不会同时生效,so只配置其中一个就好了. eg1: 单独一个path配置 logging.path=E:/lo ...

  10. 剑指offer12:求解double类型的浮点数base和int类型的整数exponent的次方。 保证base和exponent不同时为0

    1. 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.保证base和exponent不同时为0. 2. 思路和方法 分析: 由于 ...