0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

gcc的编译选项总结

威廉希尔官方网站 让梦想更伟大 来源:CSDN威廉希尔官方网站 社区 作者: 冉冉云 2022-11-02 09:37 次阅读

前言

本文用于记录我在学习和工作中遇到的各种GCC选项,虽然这些选项可以在GNU的手册上查到,不过这里做个总结,可以避免每次都去查手册,算是一个备忘吧。本文的内容会不断更新扩充。

1 常用的编译选项

选项 作用
-o 指定输出文件名称
-E 只进行预处理
-S 只进行预处理、编译
-c 只预处理、编译、汇编,但不链接
-D 使用-D name[=definition]预定义名为name的宏,若不指定值则默认宏的内容为1
-l(小写的L) 使用-l libname或者-llibname,使链接器在链接时搜索名为libname.a/libname.so(静态/动态)的库文件
-L 使用-Ldir添加搜索目录,即链接器在搜索-l选项指定的库文件时,除了系统的库目录还会(优先)在-L指定的目录下搜索
-I(大写的i) 使用-I dir,将目录dir添加为头文件搜索目录
-include 使用-include file,等效于在被编译的源文件开头添加#include "file"
-static 指定静态链接(默认是动态链接)
-O0~3 开启编译器优化,-O0为不优化,-O3为最高级别的优化
-Os 优化生成代码的尺寸,使能所有-O2的优化选项,除了那些让代码体积变大的
-Og 优化调试体验,在保留调试信息的同时保持快速的编译,对于生成可调试代码,比-O0更合适,不会禁用调试信息。
-Wall 使编译器输出所有的警告信息
-march 指定目标平台的体系结构,如-march=armv4t,常用于交叉编译
-mtune 指定目标平台的CPU以便GCC优化,如-mtune=arm9tdmi,常用于交叉编译

2 其他编译选项

2.1 -x language

通常gcc通过源文件的后缀来判断该源文件是由什么语言编写的(虽然Linux中后缀没有意义),换句话说,如果我们的文件名不带后缀,那么gcc就无法判断源文件的语言类型了,也就无法完成编译。举例来说:例1我用c语言编写了一段代码,将其保存在文件名为main.lll中,执行gcc main.lll会报错:

main.lll:filenotrecognized:Fileformatnotrecognized
collect2:error:ldreturned1exitstatus
12

例2在u-boot中,生成链接脚本的命令为arm-linux-gcc -E -Wp,-MD,./.u-boot.lds.d ...... -x assembler-with-cpp -std=c99 -P -o u-boot.lds arch/arm/cpu/u-boot.lds,如果把其中的-x assembler-with-cpp去掉,则编译器给出如下信息(且不会生成链接脚本):

linkerinputfileunusedbecauselinkingnotdone
1

至此,-x language的作用就很好理解了,当我们的源文件不添加常规的后缀时,使用该选项来告诉gcc源文件使用了哪种编程语言,其中的language表明的就是语言类型,其可取的值有(不是全部):

c c-header cpp-output c++ c+±header c+±cpp-output objective-c objective-c-header objective-c-cpp-output objective-c++ objective-c+±header objective-c+±cpp-output assembler assembler-with-cpp

2.2 -fno-xxx

-fno-common遇到多个弱定义的全局符号时输出一条警告信息。

-fno-ident忽略#ident命令。

-fno-builtin遇到与内建函数同名的函数时不去链接内建函数,除非函数名以__builtin_开头,也可以使用-fno-builtin-function来针对特定的函数。

2.3 -fxxx

-ffreestanding告诉编译器要编译的目标处于独立的环境。在独立的环境中,标准库可能不存在,程序的入口也不一定是main。使用该选项的典型例子有bootloader、OS kernel等,这些程序不依赖标准库,也不需要编译器给它们添加.init段。

-fomit-frame-pointer在不需要帧指针的函数中省略掉帧指针。所谓帧指针,指的是指向一个函数的栈帧的底部的指针(栈顶指针是没办法省的)。比如x86平台就使用ebp作为帧指针。省略掉帧指针的好处是可以多出一个可用的寄存器,坏处是不利于栈回溯值得注意的是,有些平台的过程调用规范指定必须使用帧指针,此时该选项无效;同时,与该选项对应的-fno-omit-frame-pointer也不保证帧指针一定会被使用。

2.4 -Wxxx

-W/-Wextra-W是-Wextra的旧称。显然,-Wextra更具有可读性,顾名思义,该选项可以使能一些额外的警告标志。所谓额外,是针对-Wall而言的,-Wall并没有使能所有的警告,尽管它有个all。

-Wshadow使用该选项时,如果本地的变量或类型声明遮蔽了另一个变量、参数、类型、类成员(C++)、实例变量(Objective-C)或内建函数,则gcc会报警告。

-Wconversion当使用该选项时,如果隐式类型转换更改变量的值,则gcc会给出警告。这样的隐式转换有实数与整数的转换、有符号数与无符号数的转换、转向更小类型的转换等。当然,上述转换中,如果最终没有改变变量的值,那么就不会产生警告,如abs(2.0)。

2.5 -Wno-xxx

-Wno-sign-conversion关闭有符号数和无符号数之间进行类型转换时产生的警告,即使用了该选项,那么有符号数和无符号数之间转换时gcc就不报警告了。

2.6 给链接器使用的选项:-Wl,options

这里所说的链接器是指集成在可执行文件gcc中的链接器,而不是单独使用的ld。当我们通过gcc间接使用链接器时,需要在链接器的编译选项前面加上-Wl,,然后跟着编译选项,即标题中的options。GCC手册中的相应介绍如下:8b2c8c66-59f8-11ed-a3b6-dac502259ad0.png
那么,为什么需要-Wl,前缀呢?GNU的链接器手册中是这样解释的(很好懂,就不翻译了):
8b4be160-59f8-11ed-a3b6-dac502259ad0.png

接下来就介绍一些用于链接器的选项:

-Wl,-rpath=dir在编译链接时,链接器会在dir目录下搜索动态库。同时,把动态库搜索路径dir添加到可执行文件中,以便可执行文件加载运行时使用。要注意该选项与-L选项的区别,-L选项用于编译链接时添加库文件的搜索路径;而该选项仅限于动态库,并且既可以在编译链接时添加搜索路径,同时也能将搜索路径添加到可执行文件中。

3 ARM架构专有的编译选项

-mthumb使编译器生成THUMB指令

-marm使编译器生成ARM指令

-mthumb-interwork使编译器生成支持ARM和Thumb指令集之间相互调用的代码,默认是-mno-thumb-interwork

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • GCC
    GCC
    +关注

    关注

    0

    文章

    107

    浏览量

    24835
  • 编译器
    +关注

    关注

    1

    文章

    1624

    浏览量

    49112

原文标题:参考文献

文章出处:【微信号:威廉希尔官方网站 让梦想更伟大,微信公众号:威廉希尔官方网站 让梦想更伟大】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux 下GCC编译

    一、Linux 下多文件编译 在上一篇 Linux 下的 C 编程我们知道了 Linux 下的编译器为 GCC ,以及如何使用 GCC 进行编译
    的头像 发表于 09-11 15:18 2621次阅读
    Linux 下<b class='flag-5'>GCC</b>的<b class='flag-5'>编译</b>

    gcc和Linux gcc 的常用选项

    gcc的使用方法gcc选项】文件名gcc常用选项gcc-v: 查看
    发表于 10-19 22:43

    浅谈gcc编译

    3.3 gcc编译器 GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言
    发表于 10-18 13:48 0次下载

    常见gcc编译警告整理以及解决方法

     GCC有很多的编译选项,警告选项;指定头文件、库路径;优化选项。本文针整理一下GCC的警告
    发表于 11-14 11:19 2.1w次阅读

    GCC编译器你需要知道的入门知识

    编译一个包含许多源文件的工程时,若只用一条GCC命令来完成编译是非常浪费时间的。假设项目中有100个源文件需要编译,并且每个源文件中都包含 10000行代码,如果像上面那样仅用一条
    的头像 发表于 03-13 15:12 8786次阅读

    嵌入式Linux工具之GCC常用编译选项

    “-I dir”选项可以在头文件的搜索路径列表中添加 dir 目录。由于 Linux 中头文件都默认放到了“/usr/include/”目录下,因此,当用户希望添加放置在其他位置的头文件时,就可以通过“-I dir”选项来指定,这样,g
    的头像 发表于 03-22 11:16 7712次阅读
    嵌入式Linux工具之<b class='flag-5'>GCC</b>常用<b class='flag-5'>编译</b><b class='flag-5'>选项</b>

    GCC编译优化指南

    这些信息,gcc将猜测哪个分支将被经常运行以进行优化。这类优化信息将会存放在一个以源文件为名字的并以".da"为后缀的文件中。  全局选项:  -pipe  在编译过程的不同阶段之间使用管道而非临时文件
    发表于 04-02 14:36 538次阅读

    Linux系统下Gcc的基本用法和选项

    在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。Gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数
    发表于 08-20 09:57 1268次阅读

    gcc的使用方法以及Linux gcc 的常用选项

    gcc的使用方法 gcc选项】文件名 gcc常用选项 gcc -v: 查看
    的头像 发表于 10-22 14:42 3104次阅读

    基于GCC实现支持MISRAC的安全编译

    基于GCC实现支持MISRAC的安全编译器(通信电源威廉希尔官方网站 杂志简介)-基于GCC实现支持MISRAC的安全编译器                    
    发表于 09-24 11:09 9次下载
    基于<b class='flag-5'>GCC</b>实现支持MISRAC的安全<b class='flag-5'>编译</b>器

    STM32 GCC编译环境搭建

    ://launchpad.net/~team-gcc-arm-embedded/+archive/ubuntu/ppa(1)、在/usr/local目录下新建 complier 文件夹(存放编译工具链)#cd /user/local#mkdir complier#chmo
    发表于 12-22 18:44 8次下载
    STM32 <b class='flag-5'>GCC</b><b class='flag-5'>编译</b>环境搭建

    GCC编译优化系列】-specs=kernel.specs

    GCC编译优化系列】GCC编译链接时候--specs=kernel.specs链接属性究竟是个啥
    的头像 发表于 07-11 09:25 3446次阅读
    【<b class='flag-5'>GCC</b><b class='flag-5'>编译</b>优化系列】-specs=kernel.specs

    GCC编译运行报错】error while loading

    GCC编译】运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file
    的头像 发表于 08-26 13:14 7299次阅读
    【<b class='flag-5'>GCC</b><b class='flag-5'>编译</b>运行报错】error while loading

    如何从GCC源码学编译原理

    本文结合编译原理理论和GCC实践做了一个总结,希望能给需要了解编译原理和底层知识的同学一个更快的学习路径。
    的头像 发表于 03-02 16:15 3136次阅读
    如何从<b class='flag-5'>GCC</b>源码学<b class='flag-5'>编译</b>原理

    Keil MDK使用GCC编译器的方法

    有网友问:Keil 编译速度有点慢,它支持GCC编译吗?
    的头像 发表于 03-24 09:57 3080次阅读
    Keil MDK使用<b class='flag-5'>GCC</b><b class='flag-5'>编译</b>器的方法