GCC参数详解

GCC命令与参数详解 使用 GCC 需要对编译的四个阶段(编译过程),以及编译的规则有一定的了解,熟悉使用 GCC 对于编写 Makefile 具有决定性的作用。GCC 的命令使用非常灵活,命令都以 gcc 开头然后配合待编译文件名,编译选项即可(可以说 GCC 就只有一条命令,只是编译选项较多而已)。命令选项可以随意组合,只需要注意选项是否包含参数即可,如果选项包含参数则参数需要紧紧跟随在选项后方。 阅读详情
gcc是gnu compiler collection 的简称,他包含了多种语言的编译器,如C, C++, Objective-C, Objective-C++, Java, Fortran和Ada。但每种编译器的名字不一样,gcc and g++ 分别是 gnu 的 c & c++ 编译器
gcc/g++ 在执行编译工作的时候,总共需要 4 步
1. 预处理, 生成 .i 的文件 [ 调用预处理器 cpp]
2. 将预处理后的文件转换成汇编语言 , 生成文件 .s[ 调用编译器 gcc/egcs]
3. 有汇编变为目标代码 ( 机器代码 ) 生成 .o 的文件 [ 调用汇编器 as]
4. 连接目标代码 , 生成可执行程序 [ 调用链接器 ld]
常见的gcc参数介绍
-x language filename
   设定文件所使用的语言 , 使后缀名无效 , 对以后的多个有效 . 也就是根
   据约定 C 语言的后缀名称是 .c 的,而 C++ 的后缀名是 .C 或者 .cpp, 如果
   你很个性,决定你的 C 代码文件的后缀名是 .pig 哈哈,那你就要用这
   个参数 , 这个参数对他后面的文件名都起作用,除非到了下一个参数
   的使用。
   可以使用的参数吗有下面的这些
     `c', `objective-c', `c-header', `c++', `cpp-output',
     `assembler', and `assembler-with-cpp'.
   看到英文,应该可以理解的。
   例子用法 :
   gcc -x c hello.pig
-x none filename
  关掉上一个选项,也就是让 gcc 根据文件名后缀,自动识别文件类型
  例子用法 :
   gcc -x c hello.pig -x none hello2.c   
-c
  只激活预处理 , 编译 , 和汇编 , 也就是他只把程序做成 obj 文件
  例子用法 :
   gcc -c hello.c
  他将生成 .o 的 obj 文件
-S
  只激活预处理和编译,就是指把文件编译成为汇编代码。
  例子用法
   gcc -S hello.c
  他将生成 .s 的汇编代码,你可以用文本编辑器察看
-E
  只激活预处理 , 这个不生成文件 , 你需要把它重定向到一个输出文件里
  面 .
  例子用法 :
   gcc -E hello.c > pianoapan.txt
   gcc -E hello.c | more
  慢慢看吧 , 一个 hello word 也要与处理成 800 行的代码
-o
  制定目标名称 , 缺省的时候 ,gcc 编译出来的文件是 a.out, 很难听 , 如果
  你和我有同感,改掉它 , 哈哈
  例子用法
   gcc -o hello.exe hello.c ( 哦 ,windows 用习惯了 )
   gcc -o hello.asm -S hello.c
-pipe
  使用管道代替编译中临时文件 , 在使用非 gnu 汇编工具的时候 , 可能有些问
  题
   gcc -pipe -o hello.exe hello.c
-ansi
  关闭 gnu c 中与 ansi c 不兼容的特性 , 激活 ansi c 的专有特性 ( 包括禁止一
  些 asm inline typeof 关键字 , 以及 UNIX,vax 等预处理宏 ,
-std c99
     表示编译器支持c99标准,主要有c89,c99,gnu89,gnu99,已经c++部分的c++98, c++0x, gnu++98, gnu++0x
-rdynamic
     通知链接器将所有符合添加到动态符号表中去
-lxx
    表示动态加载libxx.so库
-Lxx
    表示增加目录xx,让编译器可以在xx下寻找库文件
-Ixx
   表示增加目录xx,让编译器可以在xx下寻找头文件
优化选项
-o FILE
    生成指定的输出文件。用在生成可执行文件时。
-O0
    不进行优化处理。
-O 或 -O1
    优化生成代码。
-O2
    进一步优化。
-O3
    比 -O2 更进一步优化,包括 inline 函数。
-shared
    生成共享目标文件。通常用在建立共享库时。
-static
    禁止使用共享连接。
-w
    不生成任何警告信息。
-Wall
    生成所有警告信息。一下是具体的选项,可以单独使用
‘-Wcomment’  This option warns about nested comments.
‘-Wformat’   This option warns about the incorrect use of format strings in functions
               such as printf and scanf, where the format specifier does not agree with the  
               type of the corresponding function argument.
‘-Wunused’   This option warns about unused variables.
‘-Wimplicit’ This option warns about any functions that are used without being declared.
‘-Wreturn-type’ This option warns about functions that are defined without a return
                  type but not declared void. It also catches empty return statements in 
                  functions that are not declared void.
 
其他的一些warn编译选项(不包含在Wall中的)
‘-W’     This is a general option similar to ‘-Wall’ which warns about a selection of 
           common programming errors, such as functions which can return without a value 
           (also known as “falling off the end of the function body”), and comparisons
     一般情况下,-W 和 -Wall同时使用
‘-Wconversion’  This option warns about implicit type conversions that could cause
                  unexpected results.
‘-Wshadow’  This option warns about the redeclaration of a variable name in a scope where 
              it has already been declared.
‘-Wcast-qual’  This option warns about pointers that are cast to remove a type qualifier, 
                 such as const.
‘-Wwrite-strings’ This option implicitly gives all string constants defined in the program
                    a const qualifier, causing a compile-time warning if there is an attempt
                    to overwrite them.
‘-Wtraditional’   This option warns about parts of the code which would be interpreted
                    differently by an ANSI/ISO compiler and a “traditional” pre-ANSI 
                    compiler.(5)
上面的这些warn选项都仅仅产生warn,而不会停止编译过程,下面的选项可以将warn视为error并停止编译
‘-Werror’   changes the default behavior by converting warnings into errors, stopping
             the compilation whenever a warning occurs.
      between signed and unsigned values.
 
一般情况下,-W 和 -Wall同时使用
有关宏定义的选项
有两种定义的宏的方式:1:其他原文件中;2:在GCC的命令行中使用 -Dxxx
当这些宏被定义后(#define xxx)
在系统中使用时:#ifdef xxx 就会被预处理器扩展为有效代码;
 
在系统中已经定义了一些系统命名空间内的宏,都是以  __ 开头的 (两条下划线)
使用命令:cpp -dM /dev/null 可以查看到所有的预定义宏
 
(注:在这些宏中,有一些是GCC系统级的宏,它们都不是以__开头,这些非标准的宏可以使用
 GCC的编译选项 -ansi 使其无效)
(其实,利用-Dxxx来定义xxx,就是将xxx赋值为1 )
-Dmacro
  相当于C语言中的#define macro
  
-Umacro
  相当于C语言中的#undef macro
-undef
  取消对所有非标准宏的定义
也是利用 -Dxxx=value的方式来定义
假如利用-DNAME="" (空)来定义一个宏,则这个宏也被视为被定义的,但是如果按值展开的话,
则为空;
-Dmarco=3
     相当于在源文件中的#define macro 3
-g
  只是编译器,在编译的时候,产生调试信息。
-m
  选择不同的硬件型号 或 配置 --- 例如, 68010 还是 68020, 有没有浮点协处理器. 通过指定选项, 安装编译器的一个版本能够为所有的型号或配置进行编译.有很多选项,这里不列举,如 -mshort,认为int类型为16bit
-Xlinker option
  传递option给链接器,如果option有两个参数,我们必须用两次-Xlinker,因为它每次只能传一个字符串。例如-assert definitions,我们需要 -Xlinker -assert -Xlinker definitions。
  如果是GNU的链接器,我们可以这样写 -Xlinker -assert=definitions,而其他链接器可能不支持这样的写法
程序性能测试工具-gprof
To use profiling, the program must be compiled and linked with the ‘-pg’
profiling option:
$ gcc -Wall -c -pg collatz.c
$ gcc -Wall -pg collatz.o
编译和链接的时候添加选项 -pg ,才能使用gprof测试程序性能
然后运行编译通过的程序,才能产生gprof需要的文件 gmon.out(在当前目录下)
然后执行:
$ gprof a.out (假设可执行文件是缺省生成的)
程序覆盖测试工具- gcov
The GNU coverage testing tool gcov analyses the number of times each
line of a program is executed during a run. This makes it possible to
find areas of the code which are not used, or which are not exercised
in testing. When combined with profiling information from gprof the
information from coverage testing allows efforts to speed up a program to
be concentrated on specific lines of the source code.
编译和链接必须使用相关选项,才可以使用gcov工具。
例如:
$ gcc -Wall -fprofile-arcs -ftest-coverage cov.c
其中
‘-ftest-coverage’ adds instructions for counting the number of times
                    individual lines are executed,
‘-fprofile-arcs’ incorporates instrumentation code for each branch of
                   the program. Branch instrumentation records how frequently
                   different paths are taken through‘if’ statements and
                   other conditionals.
运行通过编译的程序,产生供gcov使用的文件:
分别带有后缀:‘.bb’‘.bbg’ and ‘.da’在当前目录下
然后运行
$ gcov cov.c (注意:是源代码文件 )
这样会产生一个带有标注的源文件的副本文件,后缀为 .gcov
在该文件中,标注了每一行代码的执行次数,标注为‘###### ’的语句为
未被执行到的语句。
可以通过命令:
grep ’######’ *.gcov 查找到所有未被执行到的语句
GNU Toolchain —— (二)GCC参数详解 gcc是gnu compiler collection 的简称,他包含了多种语言的编译器,如C,C++,Objective-C,Objective-C++,Java,Fortran,andAda。但每种编译器的名字不一样,gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理 阅读详情

相关推荐

分享一下使用Xilinx FPGA驱动MIPI DSI LCD屏的心路历程

分享一下调试用Xilinx FPGA驱动MIPI DSI LCD屏的心路历程,看到的朋友们,可以避免继续踩坑。

haoxingheng的专栏 5014

gcc参数详解

gcc参数详解

technologyleader的专栏 2577

直流有刷电机控制 - 驱动电路(二)

1.如图所示为最常见的推挽驱动电路,我附加了具有正反转功能的电机驱动控制,正反转是由两个继电器组成。使用推挽电路来驱动NMOS管时充电电流和放电电流都很大,因此NMOS管导通快,关断也快,而且NMOS温度不会很高。下面来介绍一下该电路的原理。(1)PWM_MCU是由单片机给出的PWM波信号,该信号是由一些列高低电平的方波构成。当信号为高电平的时候Q3导通,经过R47再到Q5的g极,此时mos导通,如果是K1闭合是正转那么K2闭合就是反转。(2)当PWM低电平时使得Q3关断,Q6导通。

u011030644的博客 4720

gcc 使用中常用的参数及命令

1. 执行过程 虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。  命令gcc (1). 首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件...

841

腾讯音乐 QQ音乐商业化客户端开发工程师:岗位深度解析与面试攻略

腾讯音乐QQ音乐商业化客户端开发工程师岗位要求3年以上Android开发经验,熟练掌握Kotlin/Java及跨端开发技术。核心职责包括QQ音乐客户端功能开发、架构优化、性能提升及技术攻关。岗位要求计算机相关本科以上学历,具备完整项目开发经验,熟悉TCP/IP等网络协议,能独立解决复杂技术问题。面试重点考察项目经验、架构设计、性能优化及新技术研究能力,建议候选人准备具体案例,量化成果,并熟悉Flutter等跨端技术。该职位强调技术深度与产品思维的结合,需展现扎实的编程基础、问题解决能力和团队协作精神。

郑伟强dev的专栏 366

用 SAP S/4HANA Configure Predefined Custom Fields 玩转预定义自定义字段:从概念到实战

SAP预定义自定义字段配置指南:安全扩展业务模型的云原生方案 摘要: 本文系统介绍SAP S/4HANA Cloud中预定义自定义字段的配置方法,对比普通自定义字段与预定义字段的区别,阐述其技术特点与业务价值。重点解析"Configure Predefined Custom Fields"应用的核心功能,包括字段元数据配置、多语言支持、UI集成等能力,并通过业务伙伴扩展案例演示完整实施流程。文章指出预定义字段方案在云环境下的独特优势:既满足业务扩展需求,又能保证系统可升级性,是SaaS环

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 80

Argument of type '(Foo::)(int,int)' does not match 'void (*)(int,int)'以及静态函数问题

今天在封装DTL函数的时候,遇到了这个错误: error: argument of type ‘void (EH_Database::)(ParamObjExample&)’ does not match ‘void (*)()’  也就是我的成员函数,与普通的调用函数指针不匹配

coder_xia的专栏 5657

手把手教你学simulink(44.1)--串励直流电动机场景示例:基于Simulink开发一个串励直流电动机电压控制仿真模型

高启动转矩:由于励磁绕组和电枢绕组串联连接,电机在启动时可以产生较大的转矩。速度随负载变化:由于励磁电流和电枢电流是同一电流,电机的速度会随着负载的变化而显著变化。适用于重载启动:适合用于需要高启动转矩的应用,如起重机、牵引系统等。

MHD0815的博客 340

GCC 参数详解

PWN——GCC编译中几种保护打开和关闭的参数 NX:-z execstack / -z noexecstack (关闭 / 开启) 栈不可执行,开启后不会把栈上的数据当作代码来执行 Canary:-fno-stack-protector /-fstack-protector / -fstack-protector-all (关闭 / 开启 / 全开启) 打开后会向栈中插入一段特殊数据,在函数返回的时候验证这段特殊数据是否被改变,如果改变,则终止该程序。防止栈溢出。 PIE:-no-pie / -

weixin_45943522的博客 2279

【32】软考软件设计师——算法题(一):分治法与动态规划深度精讲|下午第4题常考满分攻略

本文是《软件设计师·50讲通关|从零基础到工程师职称》专栏第32篇,正式开启**模块四:应用技术(下午题)算法大题专项**,聚焦下午第4道高频必考大题核心两大算法:分治法与动态规划。全文超4000字深度拆解两大经典算法的底层核心思想、算法策略识别技巧、递归边界设计、状态转移方程推导,全覆盖代码填空高频考点、时间复杂度分析、经典题型解题套路;配套可直接默写的递归代码模板、DP状态设计范式、真题完整填空案例,彻底解决考生分不清分治与DP、递归边界写错、状态转移推不出、复杂度算不对四大核心痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 637

内存越界一定会导致程序崩溃吗?详解内存越界

本文详细解释了内存越界不一定导致内存越界的问题,全面介绍了C++内存越界的相关内容。

dvlinker的技术专栏 2万+

GCC常用参数详解

简介 gcc and g++现在是gnu中最主要和最流行的c & c++编译器 .gcc/g++在执行编译工作的时候,总共需要以下几步: 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] 3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld] GCC能够处理的后

小石头 1335

基于扣子3.0复刻MIT“AI股神团队版”:实时股票数据API接入与策略选股复盘系统

基于扣子3.0的AI量化投资系统摘要 本文提出了一种基于扣子(Coze)3.0平台的AI量化投资解决方案,整合实时股票数据与策略选股功能。系统采用三层架构: 数据层:通过AKShare等开源工具获取A股实时行情和历史K线数据,支持批量数据抓取和清洗 策略层:内置多因子选股模型和技术指标分析模块,实现自动化标的筛选 应用层:利用扣子3.0的插件和工作流功能,构建从数据采集到投资建议的完整流程 系统特点包括:完全开源的数据接入方案、Python实现的策略计算模块、以及扣子平台提供的可视化编排能力~~~~~~~~

huanghm88的专栏 267

gcc 参数详解

GCC参数详解[介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] 3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as] 4.连接目标代码,生成可执行程序[链接器ld] [参数详解] -x language f

hi!abslute005 517

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

GCC参数介绍

gcc参数介绍 -x language filename 设定文件所使用的语言,而不是以后缀识别语言 -x none filename 关掉上个选项的语言设置,使用文件的后缀识别语言 -c 对文件进行预处理、编译和汇编,生成obj文件 gcc -c hello.c -C 在预处理的时候,不删除注释信息,一般用于分析程序 -S 只进行预处理和编译,生成汇编代码 gcc -S hello.c ...

qq_38600065的博客 2278

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

gcc参数大全

[介绍]  gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步  1.预处理,生成.i的文件[预处理器cpp]  2.将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]  3.有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]  4.连接目标代码,生成可执行程序[链接器ld] [参数详解]  -x lang

3904

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

linux GCC参数详解

GCC参数详解 [版本] -0.13 [声明] 这篇文档是我的关于gcc参数的笔记,我很怀念dos年代我用小本子,纪录所有的dos 命令的参数.哈哈,下面的东西可能也不是很全面,我参考了很多的书,和gcc的帮助. 不全的原因是,有可能我还没有看到这个参数,另一种原因是,我可能还不会用它 不过,我会慢慢的补齐的.哈哈 如果你要转在本文章请保留我的ema

6315

GCC参数详解gdb

GCC参数详解[版本] -0.13 [声明] 这篇文档是我的关于gcc参数的笔记,我很怀念dos年代我用小本子,纪录所有的dos 命令的参数.哈哈,下面的东西可能也不是很全面,我参考了很多的书,和gcc的帮助. 不全的原因是,有可能我还没有看到这个参数,另一种原因是,我可能还不会用它 不过,我会慢慢的补齐的.哈哈 如果你要转在本文章请保留我的email(pianopan@beeship.com)和

jiangxinyu的专栏 1056
上一篇: 技术项目走向失败的五条“捷径”
下一篇: Can't locate JSON.pm in @INC 解决方法
tspangle
博客等级 码龄19年 81粉丝 88原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值