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。

参考

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

2 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. linux常用命令 http://mirrors.163.com/ubuntu-releases/12.04/

    由于记忆力有限,把平时常用的Linux命令整理出来,以便随时查阅: linux 基本命令 ls     (list 显示当前目录下文件和目录 ls -l 详细显示 =ll ) [root@linux ...

  2. Windows下Android Studio长时间停留在Building "Project Name" Gradle project info画面的解决方法

    问题描述: 创建好一个Android项目后,Android Studio长时间停留在Building [Project Name] Gradle project info画面不动. 原因: 此时And ...

  3. 【开源java游戏框架libgdx专题】-03-项目开发与调试

    创建libgdx项目 下载项目配置工具 gdx-setup.jar 生成项目 导入Eclipse File -> Import -> Gradle -> Gradle Project ...

  4. 抓取锁的sql语句-第四次修改

    --完成情况   变量V_BLOCKING_SID 用来动态抓取 产生锁的会话id,输出参数没有任何问题,但是执行报错  标识符无效! CREATE OR REPLACE PROCEDURE SOLV ...

  5. 156 Useful Run Commands

    To Access… Run Command Accessibility Controls access.cpl Accessibility Wizard accwiz Add Hardware Wi ...

  6. 【转】那些好用的iOS开发工具

    原文:http://www.devtang.com/blog/2014/06/29/ios-dev-tools/ 前言 从苹果发明iPhone起,AppStore上的一个又一个类似flappy bir ...

  7. 重新开始学习javase_对象的摧毁

    一.概述(转:@深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版) ) 经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了 ...

  8. Java基础--说集合框架

    版权所有,转载注明出处. 1,Java中,集合是什么?为什么会出现? 根据数学的定义,集合是一个元素或多个元素的构成,即集合一个装有元素的容器. Java中已经有数组这一装有元素的容器,为什么还要新建 ...

  9. 用Guava辅助Throwable异常处理

    Guava的 Throwables 工具常常可以让exception处理更方便. Propagation 有时候,你会想把捕获的exception抛到上一个try/catch块.对于 RuntimeE ...

  10. js 得到当前季度

    Date.prototype.getQuarter = function() { var month = this.getMonth(); if(month < 3) { return '第一季 ...