`

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

 
阅读更多

转载自:http://my.oschina.net/alphajay/blog/4953?from=rss

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

当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib()

写在specs内的

后来用-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,"指定(如例3所示)。当指定多个动态库搜索路径时,路径之间用冒号":"分隔)

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

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

可以通过执行可执行文件pos得到的结果不同获知其搜索到了哪个动态库,从而获得第1个动态库搜索顺序,然后删除该动态库,再执行程序pos,获得第2个动态库搜索路径,再删除第2个被搜索到的动态库,如此往复,将可得到Linux搜索动态库的先后顺序。

程序pos执行的输出结果和搜索到的动态库的对应关系如表1所示

程序pos输出结果 使用的动态库 对应的动态库搜索路径指定方式

./ ./libpos.so 编译目标代码时指定的动态库搜索路径

/root/test/env/lib /root/test/env/lib/libpos.so 环境变量LD_LIBRARY_PATH指定的动态库搜索路径

/root/test/conf/lib /root/test/conf/lib/libpos.so 配置文件/etc/ld.so.conf中指定的动态库搜索路径

/lib /lib/libpos.so 默认的动态库搜索路径/lib

/usr/lib /usr/lib/libpos.so 默认的动态库搜索路径/usr/lib

综合以上结果可知,动态库的搜索路径搜索的先后顺序是:

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

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

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

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

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


____________________________


常用的环境变量名

在交叉编译的时候我们需要用到其他的库,在config时候可以通过“-I”来指定头文件目录,但是每次都需要设置的话难免有些麻烦,找到一个简单的方法。看下文的红色部分。

有 大量的环境变量可供设置以影响 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 命令行选项指定的目录在环境变量的前面,首先被查找。也见 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下gcc编译中关于头文件与库文件搜索路径相关问题.pdf

    Linux 下的 gcc 编译中,头文件和库文件的搜索路径是编译器在编译过程中查找头文件和库文件的路径。编译器会在指定的目录中查找头文件和库文件,如果没有找到,就会报错。为了解决这个问题,需要了解 gcc 编译器的...

    GCC的默认头文件路径和库文件

    GCC通过一系列环境变量来管理编译过程中的头文件和库文件搜索路径。了解并合理设置这些环境变量对于提高编译效率至关重要。 - **`C_INCLUDE_PATH`** - 用途:当编译C程序时,此环境变量用于指定头文件的搜索路径...

    Linux 特殊头文件集合

    例如,使用MinGW或Cygwin这样的工具链,它们模拟了Linux的环境,包括头文件和库。通过将压缩包解压并将其包含路径添加到编译器的设置中,可以确保在编译时能找到所有必要的头文件,从而避免“缺失头文件”的错误。 ...

    头文件包含及库的链接路径问题

    理解并掌握头文件和链接库文件的搜索路径对于在Linux环境下进行高效的C/C++编程非常重要。正确配置这些路径不仅可以避免编译错误,还能提高程序的可移植性和维护性。希望本文提供的信息能够帮助您更好地理解和管理...

    MySQL中头文件和库.rar

    在Linux系统中,通常会使用`-lmysqlclient`这样的编译选项来链接`libmysqlclient`库,而在Windows上,可能需要指定具体的`.dll`文件路径。 使用MySQL的C++ API,我们可以执行以下操作: 1. 连接数据库:使用`MYSQL...

    keil头文件路径设置

    同时,理解不同路径表示法(如`.`, `..`, `./`, `../`)的含义及其在Windows和Linux平台上的差异,对于跨平台项目尤为重要。 通过上述介绍,我们可以看出,无论采用哪种方法,关键在于确保编译器能够准确无误地定位...

    MYSQL库文件和头文件

    3. **使用方法**:在工程中使用MySQL库和头文件,首先需要确保库文件路径被编译器正确链接。在CMakeLists.txt或者Makefile中指定库路径和链接选项,例如`-L/path/to/mysql/lib -lmysqlclient`。同时,通过`#include ...

    mysql5.5.7z mysql的c语言头文件和库文件

    此外,为了在项目中使用这些库,你需要确保在编译和链接阶段正确地指定了头文件路径(-I参数)和库文件路径(-L参数),并链接相应的库(-lmysqlclient)。 总之,MySQL 5.5的C语言头文件和库文件为C程序员提供了...

    FFMPEG头文件和库,可直接添加到工程编译

    这个压缩包提供的是 FFmpeg 的头文件和库文件,方便开发者直接将其集成到自己的项目中进行编译,从而实现对音视频的处理功能。 1. **FFmpeg 头文件**: 头文件通常以 `.h` 结尾,它们包含了函数声明、结构体定义、...

    mysql开发用头文件和库文件(mysql.h、libmyhsql等)

    在MySQL的开发过程中,头文件和库文件是至关重要的组成部分,它们提供了编程接口,使得开发者能够在应用程序中直接与MySQL数据库进行交互。本文将详细介绍`mysql.h`头文件和`libmyhsql`库文件,以及如何在C/C++程序...

    boost_1.63头文件和库文件

    Boost库是C++编程语言的一个开源库集合,它提供了许多现代C++的工具和库,以帮助开发者更高效地编写高质量、跨平台的代码。在本文中,我们将深入探讨Boost库1.63版本,包括它的特点、主要组件以及如何在Visual ...

    交叉编译libvpx源码后 生成的头文件和库 android使用

    6. **集成到Android项目**:将生成的头文件和库文件添加到Android项目的jniLibs目录下,根据不同的ABI(armeabi-v7a, arm64-v8a, x86, x86_64等)放入对应的子目录。然后在Android Studio的CMake配置中引入头文件和...

    linux mircal静态库以及头文件

    在Linux操作系统中,静态库和头文件是软件开发过程中不可或缺的部分。它们允许程序员利用已有的功能,无需重新编写代码。本篇文章将详细讲解Linux下的静态库(如`libmircal.a`)以及头文件(通常以`.h`结尾)的使用...

    linux头文件

    本文将详细介绍一些常用的Linux头文件及其作用,帮助开发者更好地理解和使用这些基础组件。 #### 二、核心头文件及其作用 1. **** - **用途**:提供断言功能,用于调试阶段检查条件是否满足。 - **示例**:`...

    OpenGL库和头文件

    3. **设置链接器**:在项目设置中,添加OpenGL库的路径到链接器的搜索目录,并指定所需的库文件,如`opengl32`和`glu32`。 4. **包含头文件**:在源代码中,通过`#include`指令引入必要的头文件,例如`#include ...

    activeMQ所需的头文件和静态库

    ActiveMQ的头文件可能包括`activemq.h`、`cppkafka.h`等,这些文件定义了API接口,使得开发者能够创建连接、发送和接收消息,管理队列和主题等功能。理解并正确引用这些头文件是使用ActiveMQ C++客户端的第一步。 ...

    CyUSB的头文件和静态库文件

    标题" CyUSB的头文件和静态库文件" 提示我们这是关于一个特定库的头文件(.h)和静态库文件(.lib),具体来说是CyUSB,这通常用于与 Cypress 68013A 芯片进行通信或驱动程序开发。Cypress 68013A 是 Cypress 半导体...

    pthread相关的头文件与 库

    `pthreads-w32-2-9-1-release`这个压缩包就是这样一个移植版的`pthread`库,包含了适用于Windows系统的头文件、库文件和DLL。 在实际开发中,为了在Windows上使用`pthread`,你需要按照以下步骤操作: 1. 解压`...

Global site tag (gtag.js) - Google Analytics