GCC的选项

-c
只生成目标文件(.o),不连接。
% gcc -c main.c
% g++ -c reciprocal.cpp
-I
可以指定头文件的目录
% g++ -c -I ../include reciprocal.cpp
-D
设置宏定义
% g++ -c -D NDEBUG reciprocal.cpp
% g++ -c -D NDEBUG=3 reciprocal.cpp
-O
优化级别,默认优化级别是2
% g++ -c -O2 reciprocal.cpp
-o
连接程序,生成可执行

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

有大量的环境变量可供设置以影响 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系统的头文件和库文件搜索路径

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

  • 当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib()
  • 写在specs内的(针对rpm包)
  • 后来用-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,"指定。当指定多个动态库搜索路径时,路径之间用冒 号":"分隔)

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

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

动态库的搜索路径搜索的先后顺序是:

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

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

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

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

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

参考

http://www.cublog.cn/u/28781/showart_401631.html

http://tech.ccidnet.com/art/302/20080219/1365287_1.html

GCC使用的更多相关文章

  1. VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%

    1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...

  2. GCC学习(1)之MinGW使用

    GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...

  3. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码

    不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...

  4. [异常解决] How to build a gcc toolchain for nRF51 on linux (very detailed!!!)

    1.Install gcc-arm-none-eabi https://devzone.nordicsemi.com/tutorials/7/This link shows that developm ...

  5. CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)

    ---恢复内容开始--- CentOS 6.6 升级GCC G++ (当前最新GCC/G++版本为v6.1.0) 没有便捷方式, yum update....   yum install 或者 添加y ...

  6. GCC 预处理、编译、汇编、链接..

    1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...

  7. 用gcc进行程序的编译

    在Linux系统上,一个档案能不能被执行看的是有没有可执行的那个权限(x),不过,Linux系统上真正认识的可执行文件其实是二进制文件(binary program),例如/usr/bin/passw ...

  8. gcc/linux内核中likely、unlikely和__attribute__(section(""))属性

    查看linux内核源码,你会发现有很多if (likely(""))...及if (unlikely(""))...语句,这些语句其实是编译器的一种优化方式,具 ...

  9. Ubuntu 14.04 LTS 下升级 gcc 到 gcc-4.9、gcc-5 版本

    如果没记错的话,阿里云ECS上的Ubuntu也是LTS版本. 如果还在使用较旧版本的Ubuntu,或者是Ubuntu LTS,那么我们是很难体验新版gcc的.怎么办呢? 我们或许可以自己去编译用旧版本 ...

  10. 低版本GCC程序向高版本移植的兼容性问题

    将低版本gcc编译过的程序移植到高版本GCC时, 可能会出现一些兼容性问题. 原因是, 为了适应新的标准,一些旧的语法规则被废弃了. 关于这方面的一些具体资料可从该处查询. 这里只是自己遇到的其中一个 ...

随机推荐

  1. 【PHP缩略图类】手机照片不能生成缩略图问题以及解决方式

    [本文原创,谢绝转载] 一.出现的问题 这几天做了手机上传照片并裁出缩略图的接口的測试,发现无论怎么.生成的缩略图都是一片漆黑.:-( 然后就把这个缩略图类单拿出来进行測试,发现仅仅要是手机拍出来的照 ...

  2. Effective C++ 总结(三)

    五.实现  条款26:尽可能延后变量定义式的出现时间 如果你定义了一个变量且该类型带一个构造函数或析构函数,当程序到达该变量时,你要承受构造成本,而离开作用域时,你要承受析构成本.为了减少这个成本,最 ...

  3. Python之路,Day8 - Socket编程进阶

    Python之路,Day8 - Socket编程进阶   本节内容: Socket语法及相关 SocketServer实现多并发 Socket语法及相关 socket概念 socket本质上就是在2台 ...

  4. OD: Kernel Vulnerabilities Analyze

    内核漏洞大多出没于 ring3 到 ring0 的交互中.从 ring3 进入 ring0 的通道,以及操作系统提供的 API 都有可能存在漏洞.例如:驱动程序中 IoControl 的处理函数,SS ...

  5. js的异步的问题的再次理解

    *js是实实在在的单线程语言,在一小个时刻,在(js的执行对列)只有一个执行,一个没有完,另一个必须等待,什么都不做,只有抖着腿的等; *本来语言本身是同步的,之所以是异步执行,是因为在浏览器环境中, ...

  6. 用css样式,为表格加入边框

    Table 表格在没有添加 css 样式之前,是没有边框的.这样不便于我们后期合并单元格知识点的讲解,所以在这一节中我们为表格添加一些样式,为它添加边框. 在右侧代码编辑器中添加如下代码: <s ...

  7. javascript基础学习(十四)

    javascript之表单对象 学习要点: 表单对象 文本框 按钮 单选框和复选框 一.表单对象 在HTML文档中可能会出现多个表单,也就是说,一个HTML文档中可能出现多个<form>标 ...

  8. JavaScript_object基础

    之前写Java时老是有点蒙,大部分都是用jQuery,但原理还不是很清楚,最近一段时间在系统的学习JavaScript,有什么问题或错误请指出,多谢..................... Obje ...

  9. 一种实现C++反射功能的想法(一)

    Java的反射机制很酷, 只需知道类的名字就能够加载调用. 这个功能很实用, 想象一下, 用户只需指定类的名称, 就可以动态绑定类型, 而且只需通过字符串指定, 字符串的使用可以使得用户的修改只需修改 ...

  10. 【C++学习之路】组合类的构造函数

    1 #include <iostream> using namespace std; class A { public: A(){ cout << "调用A无参&qu ...