zoukankan      html  css  js  c++  java
  • GCC编译选项和环境变量

    https://blog.csdn.net/DLUTXIE/article/details/8176164

    本文由GCC手册翻译得到,英语能力有限,翻译得不太好,仅为自己做记录,用于理解GCC编译时头文件及库文件的查找路径问题。

    -Idir

             表示增加dir为头文件的搜索路径,这个路径优先于系统的默认路径,所以用自己指定的头文件来替代系统默认的头文件。但是不要用这个选项来指定路径不要包括供应商提供的系统头文件(这个情况可以用-isystem),如果有多个-I选项,则路径的搜索先后顺序是从左到右的。,即在前面的路径会被选搜索。另外,如果dir以=号开头即如–I=dir,而其中的=号为被sysroot前缀替换。

    如果一个标准系统包含的目录或者用-isystem选项指定的目录同时用了-I选项,则-I选项会被忽略。那个目录仍然会被搜索,只是和没有指定-I选项时一样。这是为了确保GCC程序能过够修复系统头文件的bug和非故意的改变include_next指令的顺序。如果你确实需要改变系统路径的搜索顺序,那你可以用”-nostdinc” 和/或者“-isystem”选项。

    -nostdinc

    该选项指示不要搜索头文件的标准路径(即默认路径),而只搜索-I选项指定的路径和当前路径。

    -isysroot  dir

             该选项和—sysroot选项差不多,但只用于搜索头文件。

    --sysroot=dir

    用dir作为头文件和库文件的逻辑根目录,例如,正常情况下,如果编译器在/usr/include搜索头文件,在/usr/lib下搜索库文件,它将用dir/usr/include和dir/usr/lib替代原来的相应路径。如果你同时使用了-isysroot选项,则—sysroot会应用于库文件的搜索而-isysroot会用于搜索头文件。

    -system  dir

             该选项用于搜索头文件,但该选项指定的目录估在-I选项指定的目录后搜索而在系统默认路径前搜索。如果dir前有“=”号,则该“=”号会被sysroot前缀替换。

     

    -iquotedir

             增加用于搜索#include “file”类型的头文件的路径,并且不搜索#include<file>类型的头文件,要不就和-I选项一样了。

    -Ldir

             增加-l选项指定的库文件的搜索路径,即编译器会到dir路径下搜索-l指定的库文件。

    -Bprefix

    这个选项指定GCC到哪去查找自己的可执行文件、库文件、头文件和数据文件。编译器驱动程序运行一个或多个子程序如ccp,cc1,as,ld。当编译器需要运行某个子程序时,它将prefix作业子程序的前缀(如prefix/as)。为了正确运行每个子程序,编译器驱动程序首先-B选项指定的前缀,如果那个可文件(如prefix/as)没有查找到或者没有指定-B选项,则编译器驱动程序将尝试使用标准前缀:/usr/lib/gcc/ 和/usr/local/lib/gcc/。如果用这两个前缀也没查找到,则使用没有修改过的程序名(如as)在PATH环境变量指定的路径下查找。

    编译器会核查-B选项提供的前缀(目录),必要情况下编译器会在最后加一个分隔符。如-B/usr/bin  则最后的前缀会为:/usr/bin/,编译器在最后增加了分隔符。

    -B选项指定的前缀同样对链接器查找库文件有效,因为编译器会将该选项转换为-L选项。另外-B选项同样也对预处理器查找头文件时有效,因为编译器会将该选项转换为预处理器中的-isystem选项,在这种情况下,编译器会在prefix最后加上“include”即prefix/include。

    如果需要,运行时库文件“libgcc.a”同样会通过-B选项指定的前缀来查找,如果没找到,则接着会尝试用上面提到的那两个标准前缀查找,如果还没有找到,则会忽略掉对libgcc.a的链接。

    另外一种指定prefix前缀的方式是通过环境变量GCC_EXEC_PREFIX来指定,不过会在-B选项指定的前缀之后搜索。即先尝试用-B选项指定的前缀再尝试使用GCC_EXEC_PREFIX指定的前缀,再用标准前缀。其实前面提到的两个标准前缀应该是在安装编译器是指它的!!所以每个系统可能还不一样。

    -specs=file

    为了复盖GCC传递给cc1、cc1plus、as、ld等子程序的默认开关选项,编译器会在读取标准的“specs”文件后再处理file文件。如果在-specs中指定了多个文件,则这些文件会被按照从左到右的顺序来处理。

    -print-file-name=library

    打印出链接时将用到的library的绝对路径,这样可以看看链接的是不是确实是自己想要的库文件。

    -print-libgcc-file-name

    打印出所使用的libgcc.a文件的路径,这个特别是在使用了-nostdlib或者-nodefaultlibs选项时有用。等价于-print-file-name=libgcc.a

    -print-search-dirs

    打印出GCC安装路径、程序列表和GCC标准的默认搜索路径。

    -print-sysroot-headers-suffix

    打印出头文件的根目录。

    -dumpmachine

    打印出GCC编译的程序的目标机器。

    -dumpspecs

    打印出GCC的内建specs文件,这个文件在编译GCC时会用到。

    GCC_EXEC_PREFIX

    该环境变量用于指定编译器子程序(如as,cc1等)的前缀,编译器不会给该前缀增加“/”,但你可以自己增加。如果GCC_EXEC_PREFIX变量没有设置的话,GCC会尝试gcc所在路径为前缀。如果用指定的前缀没有找到子程序的话,GCC将在默认位置查找子程序。

    GCC_EXEC_PREFIX的默认值为:‘prefix/lib/gcc/’这里的prefix为安装gcc时指定的prefix,一般与configure配置时指定的一样。

    用-B指定的前缀会在该环境变量前缀前先搜索。该环境变量指定的前缀同样也用于查找链接所需的文件如“crt0.o”.

    除此之外,GCC还用这个指定的前缀来搜索头文件,对于一个标准头文件的目录来说一般都以“/usr/local/lib/gcc”(更精确定的是用GCC_INCLUDE_DIR来指定),GCC首先会尝试用GCC_EXEC_PREFIX指定的前缀去替换掉“/usr/local/lib/gcc”查找头文件,然后才在标准的前缀目录下搜索头文件。

    COMPILER_PATH

    GCC在该环境变量指定的目录下查找子程序,但是会在GCC_EXEC_PREFIX指定的目录后搜索。

    LIBRARY_PATH

    GCC如果在GCC_EXEC_PREFIX没有找到链接文件的话,然后会在该环境变量指定的目录下查找链接文件,另外还在-L指定的目录后搜索。

    CPATH

    C_INCLUDE_PATH

    CPLUS_INCLUDE_PATH

    这些变量指定的目录的分隔符为分号(windows),或者为冒号(linux)。CPATH指定的路径的功能与-I项指定的一样,只是会在-I选项指定的目录后查找,另外对任何语言都适用。其它的两个环境变量是对特定语言的,同-isystem选项一样,但会在-system选项指定的目录后搜索。在这些环境变量中,一个空的元素是指示编译器在当前目录下查找。

    总结:

    用于搜索头文件的选项:

    1.    -Idir   -isystem dir -Bprefix   -sysroot  dir  --sysroot=dir  -iquote dir

    2.   GCC_EXEC_PREFIX  CPATH  C_INCLUDE_PATHCPLUS_INCLUDE_PATH

     

    用于搜索库文件的选项:

    1.   -Ldir   -Bprefix

    2.   GCC_EXEC_PREFIX

    3.   LIBRARY_PATH

     

    用于搜索GCC子程序的选项:

    1.   -Bprefix

    2.   GCC_EXEC_PREFIX

    3.   COMPILER_PATH

    4.    GCC安装时的路径(可以通过gcc –print-search-dirs查询)

    5.   PATH

  • 相关阅读:
    ThinkPHP 3.2.2 实现持久登录 ( 记住我 )
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 17 电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/shinedream/p/12656897.html
Copyright © 2011-2022 走看看