现在的位置: 首页 > 综合 > 正文

gcc 参数详解 | (待完善)

2017年10月26日 ⁄ 综合 ⁄ 共 2356字 ⁄ 字号 评论关闭
  • gcc 执行编译工作的时候总共会经过4步:

    1. 预处理,生成 .i 的文件【预处理器cpp】
    2. 将预处理后的文件转换成汇编语言,生成文件.s[编译器egcs]
    3. 由汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
    4. 链接目标代码,生成可执行程序[链接器ld]
  • 参数解释:
    1. CC 

    2. CFLAGS 和 CXXFLAGS
      • CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项。这两个变量实际上涵盖了编译和汇编两个步骤。大多数程序和库在编译时默认的优化级别是"2"(使用"-O2"选项)并且带有调试符号来编译,也就是 CFLAGS="-O2 -g", CXXFLAGS=$CFLAGS 。事实上,"-O2"已经启用绝大多数安全的优化选项了。另一方面,由于大部分选项可以同时用于这两个变量,所以仅在最后讲述只能用于其中一个变量的选项。[提醒]下面所列选项皆为非默认选项,你只要按需添加即可

        • 先说说"-O3"在"-O2"基础上增加的几项:

          • -finline-functions

            • 允许编译器选择某些简单的函数在其被调用处展开,比较安全的选项,特别是在CPU二级缓存较大时建议使用
          • -funswitch-loops
            • 将循环体中不改变值的变量移动到循环体之外
          • -fgcse-after-reload
            • 为了清除多余的溢出,在重载之后执行一个额外的载入消除步骤。
        • 另外:
          • -fomit-frame-pointer

            • 对于不需要栈指针的函数就不在寄存器中保存指针,因此可以忽略存储和检索地址的代码,同时对许多函数提供一个额外的寄存器。所有"-O"级别都打开它,但仅在调试器可以不依靠栈指针运行时才有效。在AMD64平台上此选项默认打开,但是在x86平台上则默认关闭。建议显式的设置它
          • -falign-functions=N    -falign-jumps=N    -falign-loops=N    -falign-labels=N
            • 这四个对齐选项在"-O2"中打开,其中的根据不同的平台N使用不同的默认值。如果你想指定不同于默认值的N,也可以单独指定。比如,对于L2-cache>=1M的cpu而言,指定 -falign-functions=64 可能会获得更好的性能。建议在指定了 -march 的时候不明确指定这里的值
      • 这儿参考了:http://lamp.linux.gov.cn/Linux/optimize_guide.html
    3. CPPFLAGS
      • 这是用于预处理阶段的选项,常用的下面这两个吧:

        • -DNDEBUG

          • "NDEBUG"是一个标准的 ANSI 宏,表示不进行调试编译
        • -D_FILE_OFFSET_BITS=64
          • 大多数包使用这个来提供大文件(>2G)支持
      • 这儿参考了:http://lamp.linux.gov.cn/Linux/optimize_guide.html
    4. LDFLAGS
      • LDFLAGS 是传递给连接器的选项。这是一个常被忽视的变量,事实上它对优化的影响也是很明显的
      • 其参数列表可有如下:
        • -s

          • 删除可执行程序中的所有符号表和所有重定位信息。其结果与运行命令 strip 所达到的效果相同,这个选项是比较安全的
        • -Wl,options
          • options是由一个或多个逗号分隔的传递给链接器的选项列表。其中的每一个选项均会作为命令行选项提供给链接器。
        • -Wl,-On
          • 当n>0时将会优化输出,但是会明显增加连接操作的时间,这个选项是比较安全的
        • -Wl,--exclude-libs=ALL
          • 不自动导出库中的符号,也就是默认将库中的符号隐藏
        • -Wl,-m
          • 仿真连接器,当前ld所有可用的仿真可以通过"ld -V"命令获取。默认值取决于ld的编译时配置
        • -Wl,--sort-common
          • 把全局公共符号按照大小排序后放到适当的输出节,以防止符号间因为排布限制而出现间隙
        • -Wl,-x
          • 删除所有的本地符号
        • -Wl,-X
          • 删除所有的临时本地符号。对于大多数目标平台,就是所有的名字以'L'开头的本地符号
        • -Wl,-zcomberloc
          • 组合多个重定位节并重新排布它们,以便让动态符号可以被缓存
        • -Wl,--enable-new-dtags
          • 在ELF中创建新式的"dynamic tags",但在老式的ELF系统上无法识别
        • -Wl,--as-needed
          • 移除不必要的符号引用,仅在实际需要的时候才连接,可以生成更高效的代码
        • -Wl,--no-define-common
          • 限制对普通符号的地址分配。该选项允许那些从共享库中引用的普通符号只在主程序中被分配地址。这会消除在共享库中的无用的副本的空间,同时也防止了在有多个指定了搜索路径的动态模块在进行运行时符号解析时引起的混乱
        • -Wl,--hash-style=gnu
          • 使用gnu风格的符号散列表格式。它的动态链接性能比传统的sysv风格(默认)有较大提升,但是它生成的可执行程序和库与旧的Glibc以及动态链接器不兼容
      • 这儿参考了:http://lamp.linux.gov.cn/Linux/optimize_guide.html
    5. LANG
    6. LC_ALL
      • 指定多字节字符的字符分类,主要用于确定字符串的字符边界以及编译程序使用何种语言发出诊断消息;默认设置与LANG相同。中文相关的几项:"zh_CN.GB2312 , zh_CN.GB18030 , zh_CN.GBK , zh_CN.UTF-8 , zh_TW.BIG5"
      • 这儿参考了:http://lamp.linux.gov.cn/Linux/optimize_guide.html

抱歉!评论已关闭.