文档章节

linux平台下 gcc编译器 的头文件、库文件及动态链接的默认搜索的路径

HappyBKs
 HappyBKs
发布于 2015/02/14 09:10
字数 2261
阅读 77
收藏 0

gcc在编译源文件时究竟发生了什么?它是如何找到所需的头文件、库文件等,并且顺序是怎么样的?

   
如何指定GCC的默认头文件路径

有大量的环境变量可供设置以影响 GCC 编译程序的方式。利用这些变量 的控制也可使用合适的命令行选项。一些环境变量设置在目录名列表中。 这些名字和 PATH 环境变量使用的格式相同。特殊字符 PATH_SEPARATOR (安装编译程序的时候定义)用在目录名之间。在 UNIX 系统中,分隔符是冒号,而 Windows 系统中为分号。

C_INCLUDE_PATH
    编译 C 程序时使用该环境变量。该环境变量指定 一个或多个目录名列表,查找头文件,就好像在命令行中指定 -isystem 选项一样。会首先查找 -isystem 指定的所有目录。也见 CPATH 、 CPLUS_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。
COMPILER_PATH
    该环境变量指定一个或多个目录名列表,如果没有 指定 GCC_EXEC_PREFIX 定位子程序,编译程序会在此查找它的子程 序。也见 LIBRARY_PATH 、 GCC_EXEC_PREFIX 和 -B 命令行选项。
CPATH
    编译 C 、 C++ 和 Objective-C 程序时使用该环境变量。该 环境变量指定一个或多个目录名列表,查找头文件,就好像在命令行 中指定 -l 选项一样。会首先查找 -l 指定的所有目录。也见 C_INCLUDE_PATH 、 CPLUS_INCLUDE_PATH 和 OBJC_INCLUDE_PATH
CPLUS_INCLUDE_PATH
    编译 C++ 程序时使用该环境变量。该环境变 量指定一个或多个目录名列表,查找头文件,就好像在命令行中指定

        isystem 选项一样。会首先查找 -isystem 指定的所有目录。也见 CPATH 、 C_INCLUDE_PATH 和 OBJC_INCLUDE_PATH 。

DEPENDENCIES_OUTPUT
    为文件名设置该环境变量会让预处理程序将 基于依赖关系的 makefile 规则写入文件。不会包括系统头文件名字。 如果环境变量设置为单名,被看作是文件名字,而依赖关系规则的名 字来自源文件名字。如果定义中有两个名字,则第二个名字是用作依 赖关系规则的目标名。设置该环境变量的结果和使用命令行选项

        MM 、 -MF 和 -MT 的组合是一样的。也见 SUNPRO_DEPENDENCIES

GCC_EXEC_PREFIX
    如果定义了该环境变量,它会作为编译程序执行的 所有子程序名字的前缀。例如,如果将变量设置为 testver 而不是查 找 as ,汇编器首先会在名字testveras 下查找。如果在此没有找 到,编译程序会继续根据它的普通名进行查找。可在前缀名中使用斜 线指出路径名。
GCC_EXEC_PREFIX
    的默认设置为 prefix /lib/gcc-lib/ ,这里的 prefix 是安装编译程序时 configure 脚本指定的名字。该前缀也用 于定位标准连接程序文件,包含进来作为可执行程序的一部分。如果 使用 -B 命令行选项,会重写该设置。也见 COMPILER_PATH 。
LANG
    该环境变量用于指出编译程序使用的字符集,可创建宽字符文 字、串文字和注释。定义 LANG 为 C-JIS ,指出预处理程序将多字 节字符按照 JIS (日语工业标准)字符进行解释。 C-SJIS 可用来 指出 Shift -JIS 字符而 C-EUCJP 指出日文 EUC 。如果没有定义 LANG ,或定义为不可识别,函数 mblen() 被用来确定字符宽度,而 mbtowc() 用来将多字节序列转换为宽字符。
LC_ALL
    如果设置,该环境变量的值重写 LC_MESSAGES 和 LC_CTYPE 的所有设置。
LC_CTYPE
    该环境变量指出引用串中定义的多字节字符的字符分类。 主要用于确定字符串的字符边界,字符编码需要用引号或转义符,可 被错误地解释为字符串的结尾或特殊字符串。对 Australian English ,可将它设置为 en_AU ; 对 Mexican Spanish ,可将它 设置为 es_MX。如果没有设置该变量,默认为 LANG 变量的值,或如 果没有设置 LANG ,那就使用 C 英语行为。也见 LC_ALL 。
LC_MESSAGES
    该环境变量指出编译程序使用何种语言发出诊断消息。 对 Australian English ,可设置为 en_AU ;对 MexicanSpanish ,可设置为 es_MX 。如果变量没有设置,使用 LANG 变量的默认 值,或如果没有设置 LANG ,那就使用 C英语行为。也见 LC_ALL 。
LD_LIBRARY_PATH
    该环境变量不会影响编译程序,但程序运行的时 候会有影响。变量指定一个目录列表,程序会查找该列表定位共享库。 只有当未在编译程序的目录中找到共享库的时候,执行程序必须设置 该变量。
LD_RUN_PATH
    该环境变量不会影响编译程序,但程序运行的时候会 有影响。该变量在运行时指出文件的名字,运行的程序可由此得到它 的符号名字和地址。地址不会重新载入,因而可能符号引用其他文件 中的绝对地址。这和 ld 工具使用 -R 选项完全一样。
LIBRARY_PATH
    该环境变量可设置为一个或多个目录名字列表,连接 程序会搜寻该目录,以查找特殊连接程序文件,和由 -l (字母 l )命令行选项指定名字的库。由 -L 命令行选项指定的目录在环境变 量的前面,首先被查找。也见 COMPILER_PATH 。
OBJC_INCLUDE_PATH
    在编译 Objective-C 程序的时候使用该环境变 量。一个或多个目录名的列表由环境变量指定,用来查找头文件,就 好像在命令行中指定 -isystem 选项一样。所有由 -isystem 选项指 定的目录会首先被查找。也见 CPATH 、 CPLUS_INCLUDE_PATH 和 C_INCLUDE_PATH 。
SUNPRO_OUTPUT
    为文件名设置该环境变量会令预处理程序将基于依 赖关系的 makefile 规则写入文件。会包含系统头文件名。如果环境 变量被设置为单个名字,它将会被当作文件名,依赖关系规则中的名 字将由源文件的名字中获得。如果定义中有两个名字,第二个名字就 是依赖关系规则中的目标名。设置该环境变量的结果与在命令行中使 用参数 -M 、 -MF 和 -MT 的效果一样。参见 DEPENDENCIES_OUTPUT 。
TMPDIR
    这个变量包含了供编译程序存放临时工作文件的目录的路径 名。这些文件通常在编译过程结束时被删除。这种文件的一个例子就 是由预处理程序输出并输入给编译程序的文件。

Linux系统的头文件和库文件搜索路径

    **#include**的头文件,连结数据库,系统定义,总共有下列来源指定gcc去那找。

    当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib()
    写在specs内的(针对rpm包)
    后来用-D -I -L指定的
    gcc环境变量设定(编译的时候)
    ld.so的环境变量(这是run time的时候)

头文件

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

    header file的搜寻会从-I开始
    然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
    再找内定目录 :
        /usr/include
        /usr/local/include
        /usr/lib/gcc-lib/i386-linux/2.95.2/include
        /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
        /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include
    库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是
        /usr/include
        prefix/include
        prefix/xxx-xxx-xxx-gnulibc/include
        prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

库文件

cos()等函式库的选项要多加 -lm

    编译的时候:gcc会去找-L
    再找gcc的环境变量LIBRARY_PATH
    再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

运行时动态库的搜索路径

    1 在配置文件/etc/ld.so.conf中指定动态库搜索路径

    2 通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境 变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)

    3 在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目 标代码时指定程序的动态库搜索路径。这是通过gcc 的参数 "-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒 号":"分隔)

    4 默认的动态库搜索路径/lib

    5 默认的动态库搜索路径/usr/lib

动态库的搜索路径搜索的先后顺序是:

    1 编译目标代码时指定的动态库搜索路径;

    2 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

    3 配置文件/etc/ld.so.conf中指定的动态库搜索路径;

    4 默认的动态库搜索路径/lib;

    5 默认的动态库搜索路径/usr/lib。

© 著作权归作者所有

共有 人打赏支持
HappyBKs

HappyBKs

粉丝 645
博文 302
码字总数 472010
作品 0
浦东
程序员
私信 提问
gcc指定头文件路径及动态链接库路径

gcc指定头文件路径及动态链接库路径 本文详细介绍了linux 下gcc头文件指定方法,以及搜索路径顺序的问题。另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论了搜索路径的顺序问题。...

长平狐
2013/06/17
12.2K
0
[转]gcc头文件库文件搜索路径问题

原文地址:http://blog.csdn.net/diantouxiao/archive/2010/08/25/5836345.aspx 正文: 参考资料:http://hi.baidu.com/relayon/blog/item/95aaf7fcf8e3edf5fc037f89.html 我们编写程序的时候......

Orion
2011/06/12
0
0
Linux编译工具:gcc入门

1. 什么是gcc gcc的全称是GNU Compiler Collection,它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。...

zjy900507
2018/05/09
0
0
Linux下gcc生成和使用静态库和动态库详解

一、基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windows和linux的平台不同(主要是编...

lwaif
2018/01/13
0
0
在Linux平台上如何使用接静态库和共享库

1、Linux函数库介绍 函数库可以看做是事先编写的函数集合,它可以与主函数分离,从而增加程序开发的复用性。Linux中函数库可以有3种使用的形式:静态、共享和动态。 1) 静态库的代码在编译时...

晨曦之光
2012/03/09
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

脚本配置java开发环境

@echo off&setlocal enabledelayedexpansion cls @echo "This script is used to registe envionment variables......" @echo. @echo. @echo. set var=%~dp0 set var=%var:~,-1% @echo "regi......

默克鱼
31分钟前
1
0
c++中友元函数理解与使用

在学习c++这一块,关于友元函数和友元类,感觉还是不好理解,但是井下心来,理解,需要把我一下几点。 首先讲友元函数。 (1)友元函数: 1)C++中引入友元函数,是为在该类中提供一个对外(除...

天王盖地虎626
今天
2
0
OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
808
11
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
5
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部