gcc编译过程分析

3 篇文章 0 订阅
订阅专栏

GCC编译过程分析

1.1 编译过程

1.1.1 常用的编译命令

$ gcc -o hello hello.c //这句命令包含预处理 编译 汇编 链接
$ ./hello			  // 运行可执行文件
hello.c
#include <stdio.h>
#define DEBUG
int main(int argv, char **argc)
{
    printf("hello world!!\n");
    #ifdef DEBUG
    printf("debug info\n");
    #endif

    return 0;
}

运行结果:

在这里插入图片描述

1.1.2 打印详细的编译过程

$ gcc -o hello hello.c -v
$ ./hello

我们分析一下详细编译过程:

在这里插入图片描述

1.1.3 手工体验一下详细的编译过程

在这里插入图片描述

$ gcc -E -o hello.i hello.c //预处理
$ gcc -S -o hello.S hello.i //编译
$ gcc -c -o hello.o hello.S //汇编
$ gcc -o hello hello.o 其他.o //链接

分析:直观看到每个阶段生成的文件,可以vi打开各文件看看其内容。

1.2 常用的编译选项

1.2.0 源码

main.c
#include <stdio.h>
#include "add.h"
int main(int argv, char **argc)
{
	int a, b;
	printf("请输入两个被加数:");
	scanf("%d%d",&a, &b);
	
	printf("和为:%d\n",add(a,b));

	return 0;
}

add.c
int add(int num1, int num2)
{
	return num1+num2;
}

add.h
#ifndef __ADD_H
#define __ADD_H

int add(int num1, int num2);

#endif

1.2.1 常用选项

  • -E 预处理
  • -c 预处理、编译、汇编、不链接
  • -o 指定输出的文件
  • -I (大写)指定头文件目录
  • -L 指定链接库时文件目录
  • -l (小写)指定链接哪个库文件

1.2.2 编译多个文件

  • 一起编译、链接

    $ gcc -o add main.c add.c
    
  • 分开编译、统一链接

    $ gcc -c -o main.o mian.c
    $ gcc -c -o add.o add.c
    $ gcc -o add main.o add.o
    

1.2.3 制作、使用动态库

//命令
$ gcc -c -o main.o main.c
$ gcc -c -o add.o add.c
$ gcc -shared -o libadd.so add.o file1.o file2.o(可以使用多个.o 生成动态库) 
$ gcc -o add main.o -ladd -L /libadd.so所在目录
//实践
feng@ubuntu:~/work$ gcc -c -o add.o add.c
feng@ubuntu:~/work$ gcc -c -o main.o main.c
feng@ubuntu:~/work$ gcc -shared -o libadd.so add.o  //制作动态库成功
feng@ubuntu:~/work$ ls
add.c  add.h  add.o  hello.c  libadd.so  main.c  main.o
feng@ubuntu:~/work$ gcc -o add main.o -ladd -L ./  //链接成功
feng@ubuntu:~/work$ ls
add  add.c  add.h  add.o  hello.c  libadd.so  main.c  main.o
feng@ubuntu:~/work$ ./add   //第一种方式: //报错:找不到库
./add: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
feng@ubuntu:~/work$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/feng/work //导入路径
feng@ubuntu:~/work$ ./add
请输入两个被加数:12 23
和为:35
feng@ubuntu:~/work$ sudo cp libadd.so /lib   //第二种方式:放在 /lib  目录下
[sudo] password for feng:
feng@ubuntu:~/work$ cd /lib
feng@ubuntu:/lib$ ls

file                   libadd.so                            
firefox                libmbim                               python2.7             X11
firefox-addons         libqmi                                python3                     
feng@ubuntu:/lib$ cd -  //返回上一次的目录
feng@ubuntu:~/work$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home //已经不用这步了(故意搞错)
feng@ubuntu:~/work$ ./add	 									 //防止上面影响		
请输入两个被加数:23
43
和为:66       //正常执行

1.2.4 制作、使用静态库

//命令
$ gcc -c -o main.o main.c
$ gcc -c -o add.o add.c
$ ar crs libadd.a add.o file1.o file2.o(可以使用多个.o 生成静态库)
$ gcc -o add main.o libadd.a (如果.a 不在当前目录下,需要指定它的绝对或相对路径)
运行:
不需要把静态库 libadd.a 放到板子上。
注意:执行 arm-linux-gnueabihf-gcc -c -o add.o add.c 交叉编译需要在最后面加上 -fPIC 参数。

1.2.5 很有用的选项

$ gcc -E main.c // 查看预处理结果,比如头文件是哪个
$ gcc -E -dM main.c > 1.txt // 把所有的宏展开,存在 1.txt 里 
$ gcc -Wp,-MD,abc.dep -c -o main.o main.c // 生成依赖文件 abc.dep,后面 Makefile 会用



gcc编译过程
wangqinghao的专栏
10-14 437
以helloworld为例分析gcc编译过程: #include int main() {          printf(“Hello World\n”);          return 0; } 通常我们使用gcc来生成可执行程序,命令为:gcc hello.c,生成可执行文件a.out 实际上gcc hello.c可以分解为4个步骤,分别是预处理(Preprocess),
C/C++程序编译过程分析
J_H_C的博客
12-13 384
1、编译过程介绍 1)gcc编译编译过程如下: 上图中的所有步骤并不是gcc编译器全部完成,gcc只是完成编译,当然你也可以使用C编译器(ccl)来编译。对于预处理阶段,是gcc调用C预处理器(CPP)来完成的,得到hello.i文件。对于将汇编文件翻译成可重定位目标文件(二进制文件)是gcc调用汇编器(as)完成的,得到hello.o文件。这就是单个源文件翻译过程。生成可执行文件是gc...
gcc编译过程分解
Norton的专栏
03-11 745
gcc封装了程序的整个编译过程,包括 预编译/编译/汇编。 预编译:把c文件#开头的宏定义展开,处理后得到i后缀文件,如hello.i,这个文件就不会再有#define,#ifdef之类的宏。对应的gcc参数是-E,表示执行完预编译就结束。cpp的文件会被展开为hello.ii。 例子: gcc -E hello.c -o hello.i 编译:把展开后的文件转化为汇编语言,这里有严格
Gcc编译过程分解
qq_37954088的博客
03-17 290
       我们都知道,”hello world“ 程序是程序员的启蒙语句,它的编译过程一气呵成,但是它的具体编译过程是什么呢?在编译果程中做了什么? 在Linux下,当我们使用GCC编译“hello world”程序时,只需使用最简单的命令(假设源代码文件名为hello.c): $ gcc hello.c ;  $ ./a.out ; 事实上,上述过程分为四个步骤,分别是预处理(Pre...
GCC编译过程分解
Clearfix_Xia
10-01 324
gcc编程流程分解
简单使用GCC编译Keil下工程C文件
08-04
"简单使用GCC编译Keil下工程C文件" 本文主要介绍了如何使用GCC编译Keil下工程C文件。...本文主要介绍了如何使用GCC编译Keil下工程C文件,并且对Keil和GCC的特点进行了介绍,并且对可能遇到的问题进行了分析和解决。
GCC编译原理
10-21
gcc 编译原理手册,详细介绍了gcc编译过程,值得一看
gcc选项及编译过程.pdf
10-02
GCC不仅遵循ANSI C标准,还具有丰富的语言扩展,增强了程序员对编译过程的控制能力。GCC的灵活性体现在它可以通过不同的前端模块支持更多语言,如Java、Fortran等。 GCC编译过程可以分为四个阶段: 1. **预处理...
C语言编译过程
08-10
编译的概念:编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。...
使用gcc展示完整的编译过程gcc预处理模式、编译模式、汇编模式、连接模式)
ZhongUncle的博客
06-08 3871
最近在了解 clang/llvm 的时候突然发现一件事:gcc是一个工具集合,包含了或者调用将程序源代码转换成可执行程序文件的所有工具,而不只是简单的编译器。这帮助我对“编译器”有了更深刻的理解,所以写下本文作为记录。从源代码转换成可执行程序的完整过程,也就是我们平时所说的“编译过程”,实际如下(圆角矩形表示代码,矩形表示各种处理器)可以看到从源代码到可执行程序要经过预处理器(preprocessor)、编译器(compiler)、汇编器(assembler)和连接器(linker)或加载器(loader)
GCC编译过程,了解编译原理
xunye的博客
12-09 3471
说明:这篇文件是在读《程序员的自我修养——链接、装载与库》的一点笔记,权当时学习的记录。 1、GCC编译过程分解 以HelloWorld程序为例 2、预编译 规则: 命令:gcc -E XXX.c -o XXX.i   3、编译 词法分析、语法分析、语义分析及优化 ---------------&gt;&gt; 汇编代码文件 命令:gcc -S XXX.c -o ...
Linux系统下的GCC编译过程、使用命令详解(多文件编译、动态库、静态库)
DZJ_Nirvana
03-18 6593
以上是学习中大多数时候使用的gcc编译指令,上面代码是一步到位的得到链接后的文件,其本质是要经过预处理 编译 汇编 链接这四步。gcc -S -o hello.s hello.c,可直接将hello.c文件编译为汇编形式,并。通常编译hello.c 使用-o参数可命名文件,将hello.c编译后命名为hello,即gcc命令后的。数据段合并 将生成的.obj文件与库文件.lib等文件链接,生成可执行文件(.exe文件) ,地址回填。文件, 展开宏、头文件,替换条件编译,删除注释、空行、空白。
【ARM 嵌入式 编译 Makefile 系列 2 - Makefile 如何打印信息】
CodingCos的博客
08-16 1219
在Makefile中,我们可以使用echo命令来打印信息。这种方法适用于大多数的 UNIX shell,包括bash、sh、ksh、zsh等。在 Makefile 中的规则部分,你可以添加echo命令来打印一些信息。这个Makefile将在执行make allecho命令的输出默认会被 Make 显示出来。如果你想要静默地(即不显示命令自身)打印信息,你可以在命令前面加上一个all:这种情况下,make all命令将只会显示编译程序的输出,不会显示echo命令本身。同时。
C++:GCC编译GCC编译C++程序分步流程
C++ JAVA的专栏
11-15 3428
C++:GCC编译GCC编译C++程序分步流程
【C语言】GCC编译过程详述
gongdiwudu的专栏
04-16 4621
​虽然我们称GCC是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。本文将详细解释其编译的指令格式,参数选项。
gcc 开启详细编译输出信息
weixin_34167043的博客
07-09 2778
SET(CMAKE_VERBOSE_MAKEFILEon)makeVERBOSE=1 转载于:https://blog.51cto.com/yebaoshan/1672583
gcc编译文件,应用程序无法正常启动(0xc0000279)
最新发布
06-10
遇到"0xc0000279"错误,这通常是指Windows系统中执行时出现了"未知的错误代码",在应用启动时出现这种情况可能是由于多种原因,如内存问题、驱动程序冲突、损坏的动态链接库(DLL)或程序文件本身的错误。当涉及到GCC编译的文件时,这可能与编译器生成的可执行文件存在问题。 GCC(GNU Compiler Collection)编译的是Unix-like系统的应用程序,对于Windows用户来说,如果直接使用GCC编译,可能需要使用像mingw-w64这样的跨平台编译工具链,将Linux的二进制文件转换为Windows版本。 针对"0xc0000279"错误,具体步骤和分析可能包括: 1. 检查错误日志:Windows事件查看器或应用程序的崩溃报告可能提供了关于问题的更多详细信息。 2. 确认依赖:确认应用程序是否正确链接了所有必需的库,特别是动态链接库,如缺少的运行时组件或版本不匹配。 3. 验证编译:检查GCC编译过程是否有警告或错误,可能隐藏了导致问题的源代码问题。 4. 程序资源:确保所有的资源文件,如DLL、配置文件等都是完整和正确的。 5. 更新或重装系统:有时候,这个问题可能是由于操作系统级别的问题,更新或重新安装Windows可能会有所帮助。 6. 使用兼容模式或修复:如果是特定的应用程序,尝试以兼容模式运行,或者查找针对该错误的官方修复或补丁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • # STM32错误积累01:error: #11-D: unrecognized preprocessing directive 11661
  • KeilMDK设置自动生成各种文件 2350
  • gcc编译过程分析 184
  • Linux应用编程学习-文件IO 119
  • linux命令入门 92

分类专栏

  • Linux 3篇
  • STM32 2篇

最新评论

  • # STM32错误积累01:error: #11-D: unrecognized preprocessing directive

    秋容动客心: 牛的,真可以

  • # STM32错误积累01:error: #11-D: unrecognized preprocessing directive

    硬件小姜: 谢谢你😊

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Linux应用编程学习-文件IO
  • KeilMDK设置自动生成各种文件
  • linux命令入门
2023年1篇
2022年3篇
2019年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源陈王起名苑姓男孩起名errorloadingoperatingsystem喻姓起名八字五行起名网武汉雅庭装饰藏精第一福利在线给孩子起名字带金字旁轩的起名含义6月20日是什么星座轰炸大鱿鱼秦惜杨辰给软件起名起个好的情感专家名字steam在连接至steam服务器时遇到问题平安夜空间留言代码小提琴名曲魔法战队魔法连者蒙面唱将猜猜猜第一季说女生是烧杯是什么意思从娃娃抓起的名言警句姓张的猪婴儿起名大全起名木字旁的字美容院起名字大全最新免费中国素材图库富察傅恒发型设计与脸型搭配app窃明txt下载医疗器材有限公司名字起名大全知世故而不世故什么意思淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化