• Linux头文件和库文件添加环境变量与GCC编译器添加INCLUDE与LIB环境变量


     

    对所有用户有效在/etc/profile增加以下内容。只对当前用户有效在Home目录下的
    .bashrc或.bash_profile里增加下面的内容:
    (注意:等号前面不要加空格,否则可能出现 command not found)

    #在PATH中找到可执行文件程序的路径。
    export PATH =$PATH:$HOME/bin

    #gcc找到头文件的路径
    C_INCLUDE_PATH=/usr/include/libxml2:/MyLib
    export C_INCLUDE_PATH

    #g++找到头文件的路径
    CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/MyLib
    export CPLUS_INCLUDE_PATH

    #找到动态链接库的路径
    LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/MyLib
    export LD_LIBRARY_PATH

    #找到静态库的路径
    LIBRARY_PATH=$LIBRARY_PATH:/MyLib
    export LIBRARY_PATH


    延伸阅读:

     

     

    库 文件在连接(静态库和共享 库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:

    在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。

    在 /etc/ld.so.conf 文件中添加库的搜索路径。

    将自己可能存放库文件的路径都加入到/etc/ld.so.conf中是明智的选择

    添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:

    /usr/X11R6/lib

    /usr/local/lib

    /opt/lib

    需 要注意的是:第二种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库) 的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率, 所以是直接读取库列表文件 /etc/ld.so.cache 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。ldconfig ,简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache 以供使用。因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下 /sbin/ldconfig使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用 的,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂computer蠢猪一个。

    在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。

     

     

    原址:http://www.cnblogs.com/image-eye/archive/2011/08/20/2147133.html

     

    延伸阅读2:

    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 这个变量包含了供编译程序存放临时工作文件的目录的路径名。这些文件通常在编译过程结束时被删除。这种文件的一个例子就是由预处理程序输出并输入给编译程序的文件

     

  • 相关阅读:
    IPv6隧道技术——6to4实验分析
    IPV6地址解析与DAD机制实验分析
    交换机的高级特性
    组播IGMP实验分析
    BGP实验分析(二)
    BGP实验分析(一)
    路由策略实验分析(二)
    路由策略实验分析(一)
    一线互联网拼多多、饿了么、蚂蚁金服、哈啰出行、携程、饿了么、2345、百度等一些Java面试题
    Java中的匿名内部类
  • 原文地址:https://www.cnblogs.com/catkins/p/5270800.html
Copyright © 2020-2023  润新知