gcc编译C源文件
gcc编译C程序的主要过程是:预处理---编译---汇编---连接,其中:(以名为hello.c的源文件为例)
预处理:对各种预处理指令(#开头,如#include,#define)进行处理,以及删除注释和多余空白字符。生成被修改的源程序hello.i
E是通知gcc对hello.c进行预编译;o是对命令输出结果进行导入操作
gcc -E hello.c -o hello.i
编译:对代码进行语法语义分析和错误判断,生成汇编代码文件hello.s
S是通知gcc对目标文件hello.i进行编译
gcc -S hello.i -o hello.s
汇编:将汇编代码转化为计算机可识别的二进制文件,生成可重定位目标程序(二进制)hello.o
c是通知gcc对目标文件hello.s进行指令转换操作
gcc -c hello.s -o hello.o
链接:将多个.o文件合并成一个可执行文件hello
gcc hello.o -o hello
hello文件即最后可以直接运行的可执行文件,通过./hello执行,通过objdump -d hello可以将可执行文件转化为汇编语言
==========
或者可以直接通过执行gcc hello.c就可以直接生成二进制目标文件a.out,通过./a.out也可以执行结果
或者通过gcc hello.c -o hello,这样可以给生成的文件取名为hello
==========
如果是链接两个文件,可以参考:
https://blog.csdn.net/qq_31811537/article/details/79312908
https://www.linuxidc.com/Linux/2016-09/135473.htm
=================================
20190616补
今天在编译gcc时遇到了问题,更新此帖记录。
想了解elf,所以建立了一个简单的hello.c源文件只做printf("hello")。根据别的ELF博客采用如下命令编译:
gcc -c hello.c -o hello.o
想要./hello.o输出的时候报错Permission denied,这个问题可以通过在命令前加bash或chmod更改权限解决:
ly@ubuntu:~/Desktop$ ./hello.o
bash: ./hello.o: Permission denied
ly@ubuntu:~/Desktop$ bash ./hello.o
./hello.o: ./hello.o: cannot execute binary file
ly@ubuntu:~/Desktop$ chmod hello.o
ly@ubuntu:~/Desktop$ ./hello.o
bash: ./hello.o: cannot execute binary file: Exec format error
然后重看这篇之前整理的博客发现直接用gcc命令编译出来的是一个扩展名为out的二进制文件,并不是可以./执行的可执行文件。要直接生成可执行文件还是需要如下:
ly@ubuntu:~/Desktop$ gcc hello.c -o hello
ly@ubuntu:~/Desktop$ ./hello
hello
ly@ubuntu:~/Desktop$ gcc hello.c
ly@ubuntu:~/Desktop$ ./a.out
hello
之前整理的三种方式都可以生成可执行文件。
总结起来就是:带了-c编译时,-o生成的是.o文件。(毕竟-c只编译生成目标文件,不链接)
ly@ubuntu:~/Desktop$ file ./a.out
./a.out: ELF -bit LSB executable, x86-, version (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6., BuildID[sha1]=2cf583ee1d914378202ee3968923649fcbb01514, not stripped
ly@ubuntu:~/Desktop$ file ./hello.o
./hello.o: ELF -bit LSB relocatable, x86-, version (SYSV), not stripped
ly@ubuntu:~/Desktop$ file ./hello
./hello: ELF -bit LSB executable, x86-, version (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6., BuildID[sha1]=2cf583ee1d914378202ee3968923649fcbb01514, not stripped
gcc编译C源文件的更多相关文章
- GCC编译C程序源代码
编译简单的 C 程序 C 语言经典的入门例子是 Hello World,下面是一示例代码: #include <stdio.h> int main(void) { printf ...
- gcc编译基本用法~2
编译简单的 C 程序 C 语言经典的入门例子是 Hello World,下面是一示例代码: ;} 我们假定该代码存为文件‘hello.c’.要用 gcc 编译该文件,使用下面的命令: $ gcc -g ...
- gcc 编译多个源文件
序 Linux 内核和许多其他自由软件以及开放源码应用程序都是用 C 语言编写并使用 GCC 编译的. 编译C++程序 编译.链接命令 -c 只编译不里链接 -o链接 例: g++ file1 -c ...
- gcc编译过程简述
在linux系统上,从源文件到目标文件的转化是由编译器完成的.以hello.c程序的编译为例,如下: dfcao@linux: gcc -o hello hello.c 在这里,gcc编译器读取源文件 ...
- GCC 编译优化指南(转)
GCC 编译优化指南(转) http://www.jinbuguo.com/linux/optimize_guide.html 作者:金步国 版权声明 本文作者是一位开源理念的坚定支持者,所以本文虽然 ...
- GCC 编译详解
GNU CC(简称为Gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C.C++和Object C等语言编写的程序.Gcc不仅功能强大,而且可以编译如C.C++.Object C.Jav ...
- gcc编译, gdb调试, makefile写法
//test.c: #include <stdio.h> int main(void) { printf("hello world!"); return 0; } == ...
- gcc编译代码报错及编译方式
一.error: 'for' loop initial declarations are only allowed in C99 mode 前段时间写了一个小C程序,放在linux下用gcc编译出错, ...
- GCC 编译优化指南
转自: http://www.jinbuguo.com/linux/optimize_guide.html GCC 编译优化指南 作者:金步国[www.jinbuguo.com] 版权声明 本文作者是 ...
随机推荐
- Spring Tool Suite4(sts)复制粘贴卡顿(ctrl+v, ctrl+c)、按住ctrl也很卡
最近在看<Spring in Action, Fifth Edition>,下载了Spring Tool Suite4,在使用的过程中发现了一些问题: 只要在复制粘贴(ctrl+c, ct ...
- 在Docker中体验数据库之Mongodb
本文记录一下,在docker中安装Mongodb的过程. 环境:物理机 ubuntu18.04 因为环境变了,我在一台物理机上直接安装了ubuntu(非虚拟机和双系统),制作U盘镜像.安装参考:htt ...
- arcgis api 3.x for js 热力图优化篇-不依赖地图服务(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- Android为TV端助力:RecyclerView更新数据时焦点丢失
1.adapter的setHasStableIds设置成true 2.重写adapter的getItemId方法 @Override public long getItemId(int positio ...
- Git创建本地版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...
- 读书笔记之_Win10 与Jmeter5.1.1界面兼容:
读书笔记之win10 与jmeter5.1.1界面兼容: 调整前:
- webstorm2018.1 汉化
https://github.com/pingfangx/TranslatorX 这个百度云 选择webstorm 选择勾选的文件 选择你下载webstorm 的版本 我下载的是2018.1的 之后等 ...
- UE4游戏开发基础命令
在个人的Unrealengine账户中关联自己的GitHub账户成功之后,就可以访问UE4引擎的源码了. git clone -b release https://github.com/EpicGam ...
- 『cURL』curl: (6) Could not resolve host无法解析主机地址
最近在学数据挖掘时,获取数据有两种途径: 开放数据,可以直接使用和存储的数据: 网络数据,通过爬虫或云市场api(付费或免费)获取数据 我通过教程,在阿里云购买一个天气数据api,尝试使用cURL获取 ...
- SQL Server含逗号分隔的数据匹配维表
日常有时候导出数据需求时,数据列会遇到带有分隔符的ID,但又需要匹配维表(如下图所示)将ID变成名称. 这种情况可以采用“分隔-匹配-合并”的方法 具体代码为: -- 准备工作1:创建事实表数据 CR ...