• Linux下的头文件搜索路径


         对于以压缩包发布的软件,在它的目录下通常都有一个配置脚本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

  • 相关阅读:
    图像的不变性及解决手段
    007 Go语言基础之流程控制
    008 Go语言基础之数组
    006 Go语言基础之运算符
    004 Go语言基础之变量和常量
    019 Python实现微信小程序支付功能
    018 Python玩转微信小程序
    017 python--微信小程序“跳一跳‘外挂
    016 用python一步一步教你玩微信小程序【跳一跳】
    025 nginx之日志设置详解
  • 原文地址:https://www.cnblogs.com/linuxbo/p/4301716.html
Copyright © 2020-2023  润新知