`
lemoncyb
  • 浏览: 51255 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

linux头文件和库文件设置问题

 
阅读更多
当初在编译时指定的(在~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。


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

文章来源:http://blog.chinaunix.net/u/28781/showart_401631.html

在交叉编译的时候我们需要用到其他的库,在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 )命令行选项指定名字的库。
由 -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下开发,连接mysql数据库头文件和库文件(32位和64位)

    linux下开发,连接mysql数据库时候用到的头文件和库文件,32位和64位的都有,直接解压根据系统选择32位还是64位,把mysql_include和mysql_lib两个文件夹复制到主文件同级目录,然后makefile里面这样编译gcc -I./...

    OpenGL开发库 (包含头文件和库文件)

    这两个库文件可能是对应不同操作系统的,例如在Windows上可能是“libopengl32.lib”和“opengl32.dll”,而在Linux上可能是“libGL.so”。 标签:“程序开发,OpenGL,图像处理” 这些标签说明了这个资源的主要...

    Linux下gcc编译中关于头文件与库文件搜索路径相关问题.pdf

    Linux 下 gcc 编译中的头文件与库文件搜索路径相关问题 ...gcc 编译器的头文件和库文件搜索路径机制使用环境变量来控制,可以通过设置环境变量来指定头文件和库文件的搜索路径,从而解决编译过程中的问题。

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

    ### GCC的默认头文件路径和库文件 #### 概述 GCC(GNU Compiler Collection)是GNU项目的一部分,它提供了一套强大的工具链,用于...理解并掌握这些环境变量的用途和设置方法,对于Linux开发人员来说是非常有益的。

    oci头文件及库文件

    oci头文件和库文件的使用涉及到编译器选项设置、环境变量配置,如`LD_LIBRARY_PATH`,以及可能的动态库查找机制,如`ldd`。在实际开发中,需要对这些细节有清晰的理解,以确保oci应用程序的正确编译和运行。 总的来...

    MySQL中头文件和库.rar

    这两个目录分别对应了MySQL的库文件和头文件。 1. `include`目录: 这个目录通常包含了一系列`.h`文件,这些头文件是开发者在编写程序时需要引入的。例如,`mysql.h`是最基础的头文件,它提供了连接MySQL服务器、...

    jwsmtp头文件和库文件

    9. **跨平台考虑**: jwsmtp可能支持多种操作系统,如Windows、Linux或macOS,因此在不同平台上使用时,库文件和链接方式可能会有所不同。 10. **示例代码**: 示例代码能帮助初学者快速理解和使用jwsmtp,通常会展示...

    opengl的所有头文件,库文件和链接文件及配置方法

    本资源包含了OpenGL编程所需的头文件、库文件和链接文件,以及如何在不同操作系统上进行配置的方法。下面我们将深入探讨OpenGL的基础知识和配置步骤。 首先,OpenGL是一个跨语言、跨平台的应用程序编程接口(API)...

    libxl头文件和库

    这个库通常包含头文件和库文件,开发者通过引用头文件并在代码中链接库文件,能够在C++项目中实现读写Excel文件的功能。 描述中提到“精简的版本”,意味着这个版本可能去除了非核心功能,比如帮助文档,以减小体积...

    MYSQL库文件和头文件

    在开发过程中,我们经常会遇到需要在工程中直接使用MySQL库文件和头文件的情况,以便于与数据库进行交互。这个压缩包提供的正是这些必要的组件。 1. **动态库**:动态库(Dynamic Library)是程序运行时需要加载的...

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

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

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

    本文将详细讨论MySQL 5.5版本的C语言头文件和库文件及其相关知识。 首先,"include"目录包含的是C语言头文件,这些文件定义了函数原型、数据结构和常量,使得开发人员可以在C程序中调用MySQL的API。例如: 1. `...

    openGL 头文件,库文件,扩展glew

    在Linux或Mac OS中,库文件通常以`.a`(静态库)或`.so`(动态库)的形式存在;在Windows中,它们可能是`.lib`(静态库)和`.dll`(动态链接库)。例如,`libGL.so`、`libGLU.so`和`libGLUT.so`分别对应于OpenGL、...

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

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

    linux include 头文件

    首先,Linux头文件通常位于系统的`/usr/include`目录下,这里包含了标准C库、标准C++库以及特定于Linux的系统头文件。头文件可以分为以下几类: 1. **标准C库头文件**:如,提供输入输出功能;,提供基本的内存管理...

    Linux 特殊头文件集合

    对于C++编程,除了Linux特有的头文件外,还需要考虑标准库的头文件,如`iostream`、`vector`和`string`等。这些通常在任何C++环境中都能找到,但Linux特定的头文件如`dlfcn.h`(动态加载)或`linux/input.h`(设备输入...

    浅析C语言头文件和库的一些问题

    glibc是Linux和其他类UNIX系统中广泛使用的C库,提供了许多标准C函数和POSIX接口。有趣的是,虽然`sqrt()`和`pow()`也是数学运算常用的函数,但它们实际上也在glibc中,可能是因为在提供示例代码时的误解或者版本...

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

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

    boost_1.63头文件和库文件

    在本文中,我们将深入探讨Boost库1.63版本,包括它的特点、主要组件以及如何在Visual Studio 14和Linux环境下使用这些库文件和头文件。 Boost库1.63版是Boost组织发布的一个稳定版本,包含了从1.62版到1.63版之间的...

Global site tag (gtag.js) - Google Analytics