GCC编译选项和环境变量

时间:2021-01-15 12:44:29

本文由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