gcc笔记

学习GCC编译器工具 在 Linux 中,GCC 是 GNU Compiler Collection 的缩写,它是一套开源的编译器工具集。GCC 是一个非常强大和广泛使用的编译器,用于编译和构建多种编程语言的源代码,包括 C、C++、Objective-C、Fortran、Ada 和其他一些语言。GCC 的主要组件包括以下部分:前端(Frontend):GCC 提供了针对不同编程语言的前端,用于解析和分析特定语言的源代码,并生成中间表示(如抽象语法树)。 阅读详情

GCC 最初的意思是GNU C Compiler,而后变成了 GNU Compiler Collection,也就是 GNU 编译器家族(常见的语言都支持)。


内容如下:
1. GCC的组成部分以及使用到的软件
2. 编译和链接
3. gcc选项
4. 库搜索路径


1,GCC的组成部分以及使用到的软件
GCC 是由许多组件组成的。表 1 列出了 GCC 的各个部分,但它们也并不总是出现 的。有些部分是和语言相关的,所以如果没有安装某种特定语言,系统中就不会出现相关的文件。

表1:GCC 安装的各个部分
部分描述
c++gcc 的一个版木,默认语言设置为 C++,而且在连接的时候自动包含标准 C++ 库。这和 g++ 一样
ccl实际的C编译程序
cclplus实际的 C++ 编泽程序
collect2在不使用 GNU 连接程序的系统上,有必要运行 collect2 来产生特定的全局初始化代码(例如 C++ 的构造函数和析构函数)
configureGCC 源代码树根目录中的一个脚木。用于设置配置值和创建GCC 编译程序必需的 make 程序的描述文件
crt0.o这个初始化和结束代码是为每个系统定制的,而且也被编译进该文件,该文件然后会被连接到每个可执行文件中来执行必要的启动和终止程序
cygwin1.dllWindows 的共享库提供的 API,模拟 UNIX 系统调用
f77该驱动程序可用于编译 Fortran
f771实际的 Fortran 编译程序
g++gcc 的一个版木,默认语言设置为 C++,而且在连接的时候自动包含标准 C++ 库。这和 c++ 一样
gcc该驱动程序等同于执行编译程序和连接程序以产生需要的输出
gcj该驱动程序用于编译 Java
gnat1实际的 Ada 编译程序
gnatbind一种工具,用于执行 Ada 语言绑定
gnatlink一种工具,用于执行 Ada 语言连接
jc1实际的 Java 编译程序
libgcc该库包含的例程被作为编泽程序的一部分,是因为它们可被连接到实际的可执行程序中。 它们是特殊的例程,连接到可执行程序,来执行基木的任务,例如浮点运算。这些库中的例程通常都是平台相关的
libgcj运行时库包含所有的核心 Java 类
libobjc对所有 Objective-C 程序都必须的运行时库
libstdc++运行时库,包括定义为标准语言一部分的所有的 C++ 类和函数


表 2 列出的软件和 GCC 协同工作,目的是实现编译过程。有些是很基本的(例如 as 和 Id),而其他一些则是非常有用但不是严格需耍的。尽管这些工具中的很多都是各种 UNIX 系统的本地共具,但还是能够通过 GNU 包 binutils 得到大多数工具。
 

表2:GCC 使用的软件工具
工具描述
addr2line给出一个可执行文件的内部地址,addr2line 使用文件中的调试信息将地址翻泽成源代码文 件名和行号。该程序是 binutils 包的一部分
ar这是一个程序,可通过从文档中增加、删除和析取文件来维护库文件。通常使用该工具是为了创建和管理连接程序使用的目标库文档。该程序是 binutils 包的一部分
asGNU 汇编器。实际上它是一族汇编器,因为它可以被编泽或能够在各种不同平台上工作。 该程序是 binutils 包的一部分
autoconf产生的 shell 脚木自动配置源代码包去编泽某个特定版木的 UNIX
c++filt程序接受被 C++ 编泽程序转换过的名字(不是被重载的),而且将该名字翻泽成初始形式。 该程序是 binutils 包的一部分
f2c是 Fortran 到C的翻译程序。不是 GCC 的一部分
gcovgprof 使用的配置工具,用来确定程序运行的时候哪一部分耗时最大
gdbGNU 调试器,可用于检查程序运行时的值和行为
GNATSGNU 的调试跟踪系统(GNU Bug Tracking System)。一个跟踪 GCC 和其他 GNU 软件问题的在线系统
gprof该程序会监督编泽程序的执行过程,并报告程序中各个函数的运行时间,可以根据所提供 的配置文件来优化程序。该程序是 binutils 包的一部分
ldGNU 连接程序。该程序将目标文件的集合组合成可执行程序。该程序是 binutils 包的一部
libtool一个基本库,支持 make 程序的描述文件使用的简化共享库用法的脚木
make一个工具程序,它会读 makefile 脚木来确定程序中的哪个部分需要编泽和连接,然后发布 必要的命令。它读出的脚木(叫做 makefile 或 Makefile)定义了文件关系和依赖关系
nlmconv将可重定位的目标文件转换成 NetWare 可加载模块(NetWare Loadable Module, NLM)。该 程序是 binutils 的一部分
nm列出目标文件中定义的符号。该程序是 binutils 包的一部分
objcopy将目标文件从一种二进制格式复制和翻译到另外一种。该程序是 binutils 包的一部分
objdump显示一个或多个目标文件中保存的多种不同信息。该程序是 binutils 包的一部分
ranlib创建和添加到 ar 文档的索引。该索引被 Id 使用来定位库中的模块。该程序是 binutils 包的一部分
ratforRatfor 预处理程序可由 GCC 激活,但不是标准 GCC 发布版的一部分
readelf从 ELF 格式的目标文件显示信息。该程序是 binutils 包的一部分
size列出目标文件中每个部分的名字和尺寸。该程序是 binutils 包的一部分
strings浏览所有类型的文件,析取出用于显示的字符串。该程序是 binutils 包的一部分
strip从目标文件或文档库中去掉符号表,以及其他调试所需的信息。该程序是 binutils 包的一部
vcgRatfor 浏览器从文木文件中读取信息,并以图表形式显示它们。而 vcg 工具并不是 GCC 发布中的一部分,但 -dv 选项可被用来产生 vcg 可以理解的优化数据的格式
windresWindow 资源文件编泽程序。该程序是 binutils 包的一部分

2,编译和链接
1)编译和链接一次性操作完成
方法1:gcc main.c  #在 gcc 命令后面紧跟源文件名,会在当前目录生成a.out可执行文件

方法2:gcc main.c -o main #可以透过-o指定生成exe文件的名称

2)编译和链接分开操作
step1:编译
方法1: gcc -c main.c #就将 main.c 编译为 main.o

方法2:gcc -c main.c -o a.o #这样生成的目标文件的名字就是 a.o

step2:链接
方法1:gcc main.o #就将 main.o 链接为 a.out

方法2:gcc main.o -o main.out #这样生成的可执行文件的名字就是 main.out

3,GCC 编译器在编译一个C语言程序时需要经过以下 4 步:
将C语言源程序预处理,生成.i文件。
预处理后的.i文件编译成为汇编语言,生成.s文件。
将汇编语言文件经过汇编,生成目标文件.o文件。
将各个模块的.o文件链接起来生成一个可执行程序文件。

GCC 编译流程如下图所示:

GCCç¼è¯æµç¨

.i文件、.s文件、.o文件可以认为是中间文件或临时文件,如果使用 GCC 一次性完成C语言程序的编译,那么只能看到最终的可执行文件,这些中间文件都是看不到的,因为 GCC 已经经它们删除了。

3,gcc选项

-c
编译、汇编指定的源文件,但是不进行链接

-S
将C语言源文件编译为汇编语言,但是并不汇编该程序。使用该选项,我们可以查看C语言代码对应的汇编代码。

-E
将C语言源文件进行预处理,但是并不编译该程序。对于一般的预处理问题,可以使用这个选项进行查看,例如,宏的展开问题、文件的包含问题等。

-I
指定包含的头文件的目录

-g 选项
可生成能被 gdb 调试器所使用的调试信息。

-o
指定输出文件

-o [file1] [file2]    
将文件 file2 编译成可执行文件 file1

+++++++++++++++++++++++++++++++++++++++++++++++++++
-o选项使用举例
1) 将源文件作为输入文件,将可执行文件作为输出文件,也即完整地编译整个程序:
$ gcc main.c func.c -o app.out

将 main.c 和 func.c 两个源文件编译成一个可执行文件,其名字为 app.out。如果不使用 -o 选项,那么将生成名字为 a.out 的可执行文件。

2) 将源文件作为输入文件,将目标文件作为输出文件,也即只编译不链接:
$ gcc -c main.c -o a.o

将源文件 main.c 编译为目标文件 a.o。如果不使用 -o 选项,那么将生成名为 main.o 的目标文件。

3) 将源文件作为输入文件,将预处理文件作为输出文件,也即只进行预处理操作:
$ gcc -E main.c -o demo.i

对源文件 main.c 进行预处理操作,并将结果放在 demo.i 文件中。如果不使用 -o 选项,那么将生成名为 main.i 的预处理文件。

4) 将目标文件作为输入文件,将可执行文件作为输出文件:
$ gcc -c func.c main.c
$ gcc func.o main.o -o app.out

第一条命令只编译不链接,将生成 func.o 和 main.o 两个目标文件。第二条命令将生成的两个目标文件生成最终的可执行文件 app.out。如果不使用 -o 选项,那么将生成名字为 a.out 的可执行文件。
+++++++++++++++++++++++++++++++++++++++++++++++++++

-shared
生成动态链接库。输入文件可以是源文件、汇编文件或者目标文件。

-fPIC 
作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code)

+++++++++++++++++++++++++++++++++
举例
从源文件生成动态链接库:
$ gcc -fPIC -shared func.c -o libfunc.so

从目标文件生成动态链接库:
$ gcc -fPIC -c func.c -o func.o
$ gcc -shared func.o -o libfunc.so
+++++++++++++++++++++++++++++++++

摘自:http://c.biancheng.net/view/2382.html

-O0 、-O1 、-O2 、-O3
编译器的优化选项的 4 个级别,-O0 表示没有优化, -O1为 缺省值,-O3 优化级别最高。

gcc 命令的常用选项

选项解释
-ansi只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。
-c只编译并生成目标文件。
-DMACRO以字符串"1"定义 MACRO 宏。
-DMACRO=DEFN以字符串"DEFN"定义 MACRO 宏。
-E只运行 C 预编译器。
-g生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY连接时搜索指定的函数库LIBRARY。
-m486针对 486 进行代码优化。
-o FILE生成指定的输出文件。用在生成可执行文件时。
-O0不进行优化处理。
-O 或 -O1优化生成代码。
-O2进一步优化。
-O3比 -O2 更进一步优化,包括 inline 函数。
-shared生成共享目标文件。通常用在建立共享库时。
-static禁止使用共享连接。
-UMACRO取消对 MACRO 宏的定义。
-w不生成任何警告信息。
-Wall生成所有警告信息。

摘自:http://www.runoob.com/w3cnote/gcc-parameter-detail.html

GCC选项 –I,-l,-L
-I:指定第一个寻找头文件的目录

-L:指定第一个寻找库文件的目录

-l:表示在库文件目录中寻找指定的动态库文件

例:

gcc –o hello hello.c –I /home/hello/include –L /home/hello/lib –lworld

/home/hello/include 作为第一个头文件的寻找目录。头文件寻找顺序:/home/hello/include –> /usr/include –> usr/local/include

/home/hello/lib 作为第一个库文件的寻找目录。库文件的寻找顺序:/home/hello/lib –> /lib –> /usr/lib –> /usr/local/lib

-lworld 表示在库文件路径中寻找libworld.so的动态库文件

4,库搜索路径

静态库链接时搜索路径顺序:
1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

动态链接时、执行时搜索路径顺序:
1. 编译目标代码时指定的动态库搜索路径
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib
5. 默认的动态库搜索路径/usr/lib

有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

摘自:http://www.sohu.com/a/165547861_777180

32位版:加上 -m32 参数,生成32位的代码。
64位版:加上 -m64 参数,生成64位的代码。
debug版:加上 -g 参数,生成调试信息。
release版:加上 -static 参数,进行静态链接,使程序不再依赖动态库。加上 -O3 参数,进行最快速度优化。加上-DNDEBUG参数,定义NDEBUG宏,屏蔽断言。

当没有-m32或-m64参数时,一般情况下会生成跟操作系统位数一致的代码,但某些编译器存在例外,例如——
32位Linux下的GCC,默认是编译为32位代码。
64位Linux下的GCC,默认是编译为64位代码。
Window系统下的MinGW,总是编译为32位代码。因为MinGW只支持32位代码。
Window系统下的MinGW-w64(例如安装了TDM-GCC,选择MinGW-w64),默认是编译为64位代码,包括在32位的Windows系统下。

摘自:http://blog.sina.com.cn/s/blog_53a7e8a30102vyrs.html

**Gcc编译器报错:gcc -m32报错** Gcc编译器报错:gcc -m32报错 :/work/printf_myself$ gcc -m32 -o push_test push_test.c In file included from /usr/include/stdio.h:27:0, from push_test.c:12: /usr/include/features.h:367:25: fatal error: sys/cdefs.h: No such file or direct 立即下载

相关推荐

LangGraph实战:用Python异步构建智能客服多轮对话系统(附完整代码)

本文详细介绍了如何使用LangGraph框架和Python异步编程构建一个高性能的智能客服多轮对话系统。通过将对话流程建模为有向图,结合thread_id实现多用户对话隔离,并利用异步节点提升系统并发处理能力,有效解决了传统客服系统上下文遗忘与高并发瓶颈问题。文章提供了从环境搭建、状态管理、异步优化到复杂业务逻辑与部署的完整实战代码。

weixin_29055137的博客 149

GCC 编译器的主要组件和编译过程

标准C库:核心的C函数都有一个主要的C库来提供。如果在应用程序中用到了C库中的函数,这个库就会通过链接器和源代码连接来生成最终的可执行程序。分析器:分析器将源语言程序代码转换为汇编语言。因为要从一种格式转换为另一种格式(C到汇编),所以分析器需要知道目标机器的汇编语言。链接器:链接器将汇编器生成的单独的目标文件组合成可执行的应用程序。需要注意的是,GCC编译过程的具体实现可能因操作系统和编译器版本的不同而有所差异,但大致流程相似。汇编器:汇编器将汇编语言代码转换为CPU可以执行字节码。

weixin_45172119的博客 745

PID调参避坑指南:为什么你的电机总是震荡?从比例带积分到微分实战解析

本文针对电机控制中常见的震荡问题,提供了一份PID调参实战指南。文章深入解析了比例(P)、积分(I)、微分(D)三个参数对系统稳定性的影响,揭示了比例增益过大是导致震荡的关键原因之一,并给出了从纯比例调试到引入积分、微分的系统化调参流程与避坑要点,帮助工程师快速实现电机平稳、精准的控制。

weixin_28223453的博客 457

gcc编译器

GCC(GNUCompiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、Objective-C、Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)[1] 目录 1. gcc编译器的简介 2. gcc编译器的使用 1. gcc编译器的简介 gcc编译器说白了就是一个把一种语言(一般指高级语言)编写成电...

MrWangHao的博客 3308

Latex | IEEE双栏排版中长公式的排版

IEEE双栏排版中,有时候公式过于长了,过宽,导致单栏排版不下。

qq_43466146的博客 1万+

Python小白也能玩转迅投QMT量化交易?手把手教你从安装到第一个策略

本文为零基础Python用户提供了上手迅投QMT量化交易平台的完整指南。从Python 3.6环境配置、QMT客户端获取安装,到核心概念讲解,并手把手教你编写并回测一个经典的双均线交易策略,帮助初学者快速迈出量化交易的第一步。

weixin_29103191的博客 763

gcc编译器的简介与使用

gcc是开放源代码领域使用最广泛的编译器,功能强大,支持性能优化。目前gcc可以用来编译才C/C++,JAVA等多种语言,使用广泛。  -o  指定生成的输出文件   -E 仅执行编译预处理  -S 将C代码转化为汇编代码  -c 仅执行编译操作,不进行连接   gcc的编译分为四个部分: 1.编译预处理(展开头文件,展开宏,生成.i文件),如:gcc -E test.c -o tes

cb673335723的博客 2458

083、多帧降噪(MFR)与VST算法:低照度场景下的信噪比提升与鬼影抑制

本文深入探讨了多帧降噪(MFR)和VST算法在低照度场景中的应用与优化。作者从实际项目案例出发,指出单帧降噪的局限性,详细分析了MFR的核心原理与工程实现中的关键环节,包括帧对齐、帧选择、融合策略和鬼影抑制等技术要点。文章特别强调VST变换对噪声均匀化的重要性,并分享了实际开发中的调试经验与参数优化技巧,如"三明治"调试法和性能平衡策略。最后指出,优秀的MFR方案需要在信噪比提升、鬼影抑制和纹理保留之间找到场景化的平衡点,建议开发者通过真实场景测试验证算法效果。全文既有理论分析,又包含丰富的实战经验和技术细

zzfmlxs的博客 123

GCC编译器——GCC编译器的简介

以下内容源于C语言中文网的学习与整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 6509

2024年数字IC秋招-海康威视-数字逻辑设计工程师-笔试题

笔试题型:单选 + 多选笔试平台:百一测试(电脑监控)笔试时间:1h30minA. AW通道B. D通道C. B通道D. AR通道return x++;x = 5;y = Foo(x);

qq_42135020的博客 3199

飞牛NAS系统盘占用过高排查与解决全记录(已有效解决)

📢NAS弹出系统盘占用过高预警?别慌!亲测解决全流程来啦~ 精准定位根源+安全迁移数据,附详细实操步骤,帮同款困扰的你高效释空间、少走弯路!

XiaoqiangClub的博客 3133

GCC基础笔记

编译器首先将源代码编译成目标文件(通常是以。

weixin_69487761的博客 307

解决TexStudio编写LaTeX论文引用文献问题:正文引用处出现[?],参考文献也不显现

当我们利用LaTeX编写论文时,可能会出现引用参考文献时正文引用处出现?号,肯能的原因及解决方案如下: 问题一 忘记在\end{document}前面放\bibliographystyle{样式}和\bibliography{参考文献bib文件名}: \bibliographystyle{plain} \bibliography{sample} 其中, LaTeX 标准选项及其样式共有以下8种: plain,按字母的顺序排列,比较次序为作者、年度和标题. unsrt,样式同plain,只是按照引用的先后

左手の明天的博客 9529

GCC笔记(转)

GCC笔记  http://www.cublog.cn/u/13991/showart.php?id=96714 gnu binutils 笔记: http://www.cublog.cn/u/13991/showart.php?id=104690

linux phone 623

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

gcc 内嵌汇编的学习笔记 IV

gcc 内嵌汇编的学习笔记 IV --函数调用 作者:ShellEx. ShellEx.cn && shellex.cublog.cn 版权所有 没有经验,还是通过反汇编出来的代码来学习。先写……...

钢窟. 231

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

gcc 内嵌汇编的学习笔记 II

\r\n gcc 内嵌汇编的学习笔记 II --一个简单的条件判断 作者:ShellEx. ShellEx.cn && http://shellex.cublog.cn/ 版权所有 真不……...

钢窟. 287

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

gcc参数笔记

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

☆☆Jackyhou的清新世界☆☆ 1305

GCC学习笔记(一)

前言 GCC是GNU编译器的集合,可以编译 C, C++, Objective-C, Fortran, Ada等语言。 GCC工作的流程 示例 HelloWorld.c文件内容: #include <stdio.h> void main(void) { printf("Hello World!\n"); } 使用指令 gcc HelloWorld.c -o HelloWorld 最终生成可执行文件HelloWorld。 在直接使用gcc编译文件时,删除了很多临时文件,不利于理解

qq_34163621的博客 376

Centos7升级gcc学习笔记

转载文章 Centos7升级gcc学习笔记

ddr77的专栏 1094

gcc编译器学习笔记

gcc:一个跨平台的大型编译器,将高级语言编译成机器码。

2402_83192253的博客 398

GCC笔记

The History of GCC -------------------------------------------------------------------------------- 1984年,Richard Stallman发起了自由软件运动,GNU (Gnu's Not Unix)项目应运而生,3年后,最初版 的GCC横空出世,成为第一款可移植、可优化、支持AN

木木 1450

GCC编译器笔记

简介 目前在Linux下最常用的C语言编译器是GCC(GUN Compiler Collection).是GUN项目中符合ANSI C标准的编译系统。 能够编译C、C++、Object C等语言编写的程序,可以通过不同的前端模块来支持各种语言,如JAVA等。 基本常用参数 GCC编译器的调用参数有100多个,介绍几个最基本常用的参数。 GCC的基本用法 gcc [options] [filenames] options为编译器需要的参数,filenames为相关文件的名称。 -c 只编译,

这只猴子没有名字的博客 341
上一篇: 数据加密–详解 RSA加密算法 原理与实现
下一篇: Android GPS源码分析总结
东晋偏安
博客等级 码龄18年 939粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值