【Linux】GCC程序开发工具(上)
00. 目录
文章目录
- 00. 目录
- 01. GNU工具概述
- 02. 常用文本文件
- 03. 常用二进制文件
- 04. Binutils工具集
- 05. GCC工具
- 06. 附录
01. GNU工具概述
在Linux中,GNU Tools是主要的程序的开发工具,这组工具主要用于生成代码和分析程序。GNU Tools最重要的组成部分是GCC。GCC是GNU Compiler Collection的缩写,是一个非常优秀的跨平台编译器集合,支持x86、ARM、MIPS和PowerPC等多种目标平台,支持C、C++、Java、ADA、Fortran和Pascal等多种高级语言。
GCC能完成从C、C++、Objective-C等源文件向运行在特定CPU硬件上的目标代码的转换。对于通用计算机、一般使用GCC生成x86的可执行代码,对于嵌入式开发系统使用交叉编译GCC,生成目标机可以执行的程序。
02. 常用文本文件
*.c C语言源文件
*.C *.cxx *.cc C++语言源文件
*.i 预处理后的C语言源文件
*.ii 预处理后的C++语言源文件
*.s *.S 汇编语言文件
*.h 头文件
03. 常用二进制文件
*.o 目标文件
*.so 动态库
*.a 静态库
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件且必须要经过预处理;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是C源代码文件且不应该对其执行预处理;
.ii为后缀的文件,是C++源代码文件且不应该对其执行预处理;
.m为后缀的文件,是Objective-C源代码文件;
.mm为后缀的文件是Objective-C++源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
04. Binutils工具集
GCC是一组工具的集合,包含了预处理器、编译器、汇编器、连接器部分。当使用GCC的时候,将根据需要调用相应的工具。对于默认的文件名,GCC可以自动选择工具来完成文件处理过程。从C语言的源程序到可执行文件的转换,实质上是依靠GCC调用一系列工具完成的。
Binutils是一个二进制工具的集合,包含了汇编、链接以及一系列的辅助工具。binutils是辅助GCC的重要工具集,主要包含以下的工具。
as: GNU汇编器,用于将处理器的汇编格式代码转换成可执行代码,并存储到目标文件.o文件中
ld: GNU连接器,用于将一个或者多个目标文件(.o)、库组合成一个可执行的程序,或者生成静态库或者静态库。
ar: 归档工具,可以将多个文件组合成一个大文件,并且可以读取原始文件的内容
strip: 去除文件中的符号
nm: 可以i显示目标文件中的符号
objcopy: 转换二进制代码的工具,可以将二进制代码转换成各种格式
objdump: 显示目标文件的反汇编工具
readelf: 显示ELF文件的各种信息
strings: 显示文件中可打印字符
ranlib: 产生归档文件的索引,并将其保存到归档文件中。
addr2line: 可以将一个可执行程序的地址映射到源文件的对应的行
gprof: 显示程序调用段的各种信息。
05. GCC工具
5.1 gcc用法参考
[root@deng test]# gcc --help
用法:gcc [选项] 文件...
选项:-pass-exit-codes 在某一阶段退出时返回最高的错误码--help 显示此帮助说明--target-help 显示目标机器特定的命令行选项(使用‘-v --help’显示子进程的命令行参数)-dumpspecs 显示所有内建 spec 字符串-dumpversion 显示编译器的版本号-dumpmachine 显示编译器的目标处理器-print-search-dirs 显示编译器的搜索路径-print-libgcc-file-name 显示编译器伴随库的名称-print-file-name=<库> 显示 <库> 的完整路径-print-prog-name=<程序> 显示编译器组件 <程序> 的完整路径-print-multi-directory 显示不同版本 libgcc 的根目录-print-multi-lib 显示命令行选项和多个版本库搜索路径间的映射-print-multi-os-directory 显示操作系统库的相对路径-Wa,<选项> 将逗号分隔的 <选项> 传递给汇编器-Wp,<选项> 将逗号分隔的 <选项> 传递给预处理器-Wl,<选项> 将逗号分隔的 <选项> 传递给链接器-Xassembler <参数> 将 <参数> 传递给汇编器-Xpreprocessor <参数> 将 <参数> 传递给预处理器-Xlinker <参数> 将 <参数> 传递给链接器-combine 将多个源文件一次性传递给汇编器-save-temps 不删除中间文件-pipe 使用管道代替临时文件-time 为每个子进程计时-specs=<文件> 用 <文件> 的内容覆盖内建的 specs 文件-std=<标准> 指定输入源文件遵循的标准--sysroot=<目录> 将 <目录> 作为头文件和库文件的根目录-B <目录> 将 <目录> 添加到编译器的搜索路径中-b <机器> 为 gcc 指定目标机器(如果有安装)-V <版本> 运行指定版本的 gcc(如果有安装)-v 显示编译器调用的程序-### 与 -v 类似,但选项被引号括住,并且不执行命令-E 仅作预处理,不进行编译、汇编和链接-S 编译到汇编语言,不进行汇编和链接-c 编译、汇编到目标代码,不进行链接-o <文件> 输出到 <文件>-x <语言> 指定其后输入文件的语言允许的语言包括:c c++ assembler none‘none’意味着恢复默认行为,即根据文件的扩展名猜测源文件的语言-w 不显示警告信息-W 指定需要显示的警告信息-Wall 表示显示所有的警告信息-Werr 将警告信息当成错误、并终止编译-DMACRO 定义宏MACRO为字符串1-DMACRO=DEF 定义MACRO宏为字符串DEF-UMACRO 取消对MACRO宏的定义-ggdb 生成可被gdb使用的标准调试信息-mXXX 针对XXX CPU进行优化,例如XXX可以是486 586等-O0 不进行代码优化-O或者-O1 进行一般的代码优化,减少执行代码大小和执行的时间-O2 比-O1进行更多的优化,减少执行代码大小和执行的时间-O3 比-O2更进一步优化-MM 输出源文件的依赖关系-ansi 编译器将所有的gnu的编译器特性都关掉,可以让程序和Ansi标准兼容-include file 编译之前将file包含进去,相当于在所有编译的源文件最前面加入include <file>语句-imacros file 与-include file一样,不过这个文件在具体编译的时候只有里面定义的宏才起作用,所以只用来在file文件中定义宏-nostdinc 在搜寻include的文件路径中去掉标准的C语言头文件搜索路径,例如stdin.h文件就是放在标准头文件搜索路径下。-C 通-E参数配合使用,让预处理后的结果保留注释,一遍程序更易读。-nostartfiles 在链接的时候不把系统相关的启动代码链接起来-nostdlib 在链接的时候不把标准库链接进来以 -g、-f、-m、-O、-W 或 --param 开头的选项将由 gcc 自动传递给其调用的不同子进程。若要向这些进程传递其他选项,必须使用 -W<字母> 选项。
5.2 参考示例
[root@deng test]# ls
a.out main.c myputs.c myputs.h test.c test.h
[root@deng test]# gcc -pipe -g -Wall -I. -c test.c -o test.o
[root@deng test]# #解释
-g: 表示含有调试信息
-Wall: 表示输出所有的警告
-I. 表示包含当前目录作为头文件搜索路径,这个选项用于增加搜索头文件的路径
-pipe: 表示使用管道替换临时文件
-o: 指定输出地目标文件的名称
06. 附录
6.1【Linux】GCC程序开发工具(上)
6.2 【Linux】GCC程序开发工具(中)
6.3 【Linux】GCC程序开发工具(下)
【Linux】GCC程序开发工具(上)相关推荐
- 【Linux】GCC程序开发工具(下)
00. 目录 文章目录 00. 目录 01. GCC的二进制工具 02. objdump 03. objcopy命令 04. 总结 05. 附录 01. GCC的二进制工具 objdump 显示目标文 ...
- 【Linux】GCC程序开发工具(中)
00. 目录 文章目录 00. 目录 01. GCC的二进制工具 02. ar命令 03. readelf命令 04. strings命令 05. nm命令 06. strip命令 07. 附录 01 ...
- 【Linux系统】开发工具(上) {软件包管理器yum,更新yum源,文本编辑器vim,vim的四种基本模式,vim指令集,代码编译器gcc/g++}
一.软件包管理器:yum 1.1 yum是什么? Linux下软件的安装方法: 源码安装:下载源码,在本地自行编译,然后才能安装. rpm安装:红帽软件包管理工具,属于安装包安装. yum安装:本身会 ...
- 【Linux】Linux环境基础开发工具使用 —— yum | vim | gcc g++ | gdb | make makefile | 进度条 | git
Linux环境基础开发工具使用 1. Linux软件包管理器yum 1.1 什么是软件包 1.2 软件安装三板斧 1.2.1 查看软件包 1.2.2 安装软件 1.2.3 卸载软件 2. vim 2. ...
- 微信小程序开发工具第一次使用,网络连接不上怎么办
安装成功之后,爆出了一个bug,二维码始终出不来. (C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\16486989 ...
- Linux下C++开发工具介绍
概述 就C++开发工具而言,与Windows下微软(VC, VS2005等)一统天下相比,Linux/Unix下C++开发,可谓五花八门,各式各样.Emacs, vi, eclipse, an ...
- 《嵌入式 Linux应用程序开发标准教程(第2版)》——第1章 Linux快速入门 1.1 嵌入式Linux基础...
本节书摘来自异步社区<嵌入式 Linux应用程序开发标准教程(第2版)>一书中的第1章,第1.1节,作者 华清远见嵌入式培训中心,更多章节内容可以访问云栖社区"异步社区" ...
- 《嵌入式 Linux应用程序开发标准教程(第2版)》——1.1 嵌入式Linux基础
本节书摘来异步社区<嵌入式 Linux应用程序开发标准教程(第2版)>一书中的第1章,第1.1节,作者:华清远见嵌入式培训中心,更多章节内容可以访问云栖社区"异步社区" ...
- Linux应用程序开发 基础知识
Linux应用程序开发 本文讲述了linux应用程序开发的基本内容.值得学习! Copyright © 2006 本文遵从GNU 的自由文档许可证(Free Documentation Lice ...
最新文章
- 文件操作(ifstream、ofstream、fstream)
- DbHelperSQL.cs
- javascript 语言标准 es6简介
- ROS学习(六):CMakeLists.txt 文件
- AsyncTask中各个函数详细的调用过程,初步实现异步任务
- 写程序过程中写程序的注意事项
- ubuntu下安装vmtools失败,提示The path is not a valid path to the 3.5.0-17-generic kernel headers的解决办法...
- 汉澳sinox2014x64server已经能够下载
- JavaScript实现的List(集合)类
- MySQL高级知识(九)——慢查询日志
- pycharm显示全部数据_必备 | 提升效率的数据分析工具,吴恩达都在用
- 无卡支付,快捷支付,认证支付,协议支付,代扣区别与联系
- 【hexo】fluid中文乱码问题解决
- sagemath matlab,开源跨平台数学软件SageMath v8.1
- 网络编辑员国家职业标准
- 如何卸载Adobe Premiere Pro CC 2017和Adobe Photoshop CC 2018
- C/C++编程学习 - 第5周 ③ 圆锥体的体积
- 电子警察技术原理分析
- 【Python】绘制 对数函数
- curl使用用户名密码
热门文章
- silverlight之ToolTipService
- ssh_askpass: exec(/usr/libexec/ssh-askpass): No such file or directory
- flash中Stage,stage,root和this的区别用法
- ie里的button标签的一个bug
- 将数组按指定大小分组
- Java黑皮书课后题第1章:*1.11(人口估算)编写一个程序,显示未来5年的每年人口数。假设当前的人口是312 032 486,每年有365天
- C语言学习之输入一个大于三的值判断是否为素数
- linux除了cat读取文件内容,linux cut命令和cat命令以及查看文件内容命令总结
- 大数据针对高校_“大数据+移动支付” 安徽高校食堂智慧升级
- 【Linux】scp“免密” 远程copy较多文件