Linux中编译代码(gcc/g++),自动化构建(make/Makefile)

发布时间:2026/7/10 15:42:03
Linux中编译代码(gcc/g++),自动化构建(make/Makefile) 引言详细介绍Linux下代码是如何编译。详细介绍自动化构建make/Makefile的使用。一、简单认识gcc/ggccC编译器只能用来编译C语言的代码gC/C编译器都可以编译两者的使用完全一样下面以gcc来介绍。二、详细讲解可以先看一下这篇博客再看下面的内容。一篇文章带你搞懂编译和链接-CSDN博客编译可以分成三个步骤预处理有些书也叫预编译、编译、汇编三个过程。1.预处理头文件展开去注释宏替换条件编译对代码做裁减等等等等上面那篇博客有详细介绍语法code.c: 1 #includestdio.h 2 3 int main() 4 { 5 6 printf(hello word\n); 7 8 return 0; 9 } [zhangsanhcss-ecs-f571 dir1]$ vim code.c //写入代码 //对conde.c文件进行预处理操作-E是选项-o是重新命名为code.i [zhangsanhcss-ecs-f571 dir1]$ gcc -E code.c -o code.i [zhangsanhcss-ecs-f571 dir1]$ ll total 24 -rw-rw-r-- 1 zhangsan zhangsan 81 Aug 27 14:30 code.c -rw-rw-r-- 1 zhangsan zhangsan 16877 Aug 27 14:33 code.i [zhangsanhcss-ecs-f571 dir1]$-E程序开始翻译做完预处理就停止。可以用vim打开code.i文件看到里面的内容很长是把stdio.h这个文件给展开了。2.编译把C-汇编语言等等语法[zhangsanhcss-ecs-f571 dir1]$ gcc -S code.i -o code.s [zhangsanhcss-ecs-f571 dir1]$ ll total 28 -rw-rw-r-- 1 zhangsan zhangsan 81 Aug 27 14:30 code.c -rw-rw-r-- 1 zhangsan zhangsan 16877 Aug 27 14:33 code.i -rw-rw-r-- 1 zhangsan zhangsan 446 Aug 27 14:40 code.s [zhangsanhcss-ecs-f571 dir1]$-S编译到汇编语言就停止不进行汇编和链接可以打开code.s查看里面是汇报语言3.汇编把汇编语言翻译成二进制文件o可重定位目标二进制文件语法[zhangsanhcss-ecs-f571 dir1]$ gcc -c code.s -o code.o [zhangsanhcss-ecs-f571 dir1]$ vim code.o-c把汇编语言翻译成二进制文件就停止可以用vim打开里面是乱码因为是二进制文件。注意该二进制文件不能直接运行只有声明没有定义还需要和库链接后才可以正常运行。4.链接形成可执行文件语法[zhangsanhcss-ecs-f571 dir1]$ gcc code.o -o code [zhangsanhcss-ecs-f571 dir1]$ ll total 44 -rwxrwxr-x 1 zhangsan zhangsan 8360 Aug 27 14:48 code -rw-rw-r-- 1 zhangsan zhangsan 81 Aug 27 14:30 code.c -rw-rw-r-- 1 zhangsan zhangsan 16877 Aug 27 14:33 code.i -rw-rw-r-- 1 zhangsan zhangsan 1496 Aug 27 14:44 code.o -rw-rw-r-- 1 zhangsan zhangsan 446 Aug 27 14:40 code.s [zhangsanhcss-ecs-f571 dir1]$ ./code hello word [zhangsanhcss-ecs-f571 dir1]$可以看到代码正常运行。所以可以直接这样[zhangsanhcss-ecs-f571 dir1]$ gcc code.c -o code [zhangsanhcss-ecs-f571 dir1]$ ll total 16 -rwxrwxr-x 1 zhangsan zhangsan 8360 Aug 27 14:54 code -rw-rw-r-- 1 zhangsan zhangsan 76 Aug 27 14:53 code.c [zhangsanhcss-ecs-f571 dir1]$ ./code hello word [zhangsanhcss-ecs-f571 dir1]$三、gcc其他选项•-E 只激活预处理,这个不生成文件需要把它重定向到⼀个输出文件里面(.i)•-S 编译到汇编语言.s不进行汇编和链接•-c 编译到目标代码.o•-o 文件内容输出到后面的文件中•-static 此选项对生成的文件采用静态链接•-g 生成调试信息。GNU调试器可利用该信息。•-shared 此选项将尽量使用动态库所以生成文件比较小但是需要系统有动态库.•-O0•-O1•-O2•-O3编译器的优化选项的4个级别-O0表示没有优化,-O1为缺省值-O3优化级别最高•-w 不生成任何警告信息。•-Wall 生成所有警告信息。四、自动化构建•一个工程中的源文件不计数其按类型、功能、模块分别放在若干个目录中makefile定义了一系列的规则来指定哪些文件需要先编译哪些文件需要后编译哪些文件需要重新编译甚至于进行更复杂的功能操作•makefile带来的好处就是⸺“自动化编译”一旦写好只需要一个make命令整个工程完全自动编译极大的提高了软件开发的效率。• make是⼀个命令工具是一个解释 makefile 中指令的命令工具⼀般来说大多数的IDE都有这个命令比如Delphi的makeVisualC的nmakeLinux下GNU的make。makefile 成为了一种在工程方面的编译方法。•make是⼀条命令makefile是⼀个文件两个搭配使用完成项目自动化构建。这里推荐使用Makefile作为文件名。1.基本使用Makefile文件中1 code:code.c 2 gcc -o code code.c直接输入make来运行Makefile文件中的内容。zhangsanhcss-ecs-f571 dir1]$ make gcc -o code code.c [zhangsanhcss-ecs-f571 dir1]$ ll total 20 -rwxrwxr-x 1 zhangsan zhangsan 8360 Aug 27 15:11 code -rw-rw-r-- 1 zhangsan zhangsan 76 Aug 27 14:53 code.c -rw-rw-r-- 1 zhangsan zhangsan 32 Aug 27 15:11 Makefile [zhangsanhcss-ecs-f571 dir1]$ ./code hello word2.依赖关系和依赖方法上面的Makefile文件中code是目标文件后面的内容是依赖文件列表也就是说code依赖code.c依赖方法就是下面一行的语句语法规定以Table键开始3.详细学习Makefile的语法3.1先看一个小案例Makefile中的内容Makefile 1 code:code.o 2 gcc code.o -o code 3 code.o:code.s 4 gcc -c code.s -o code.o 5 code.s:code.i 6 gcc -S code.i -o code.s 7 code.i:code.c 8 gcc -E code.c -o code.i使用make[zhangsanhcss-ecs-f571 dir1]$ vim Makefile [zhangsanhcss-ecs-f571 dir1]$ make gcc -E code.c -o code.i gcc -S code.i -o code.s gcc -c code.s -o code.o gcc code.o -o code [zhangsanhcss-ecs-f571 dir1]$ ll total 48 -rwxrwxr-x 1 zhangsan zhangsan 8360 Aug 27 15:42 code -rw-rw-r-- 1 zhangsan zhangsan 76 Aug 27 14:53 code.c -rw-rw-r-- 1 zhangsan zhangsan 16875 Aug 27 15:42 code.i -rw-rw-r-- 1 zhangsan zhangsan 1496 Aug 27 15:42 code.o -rw-rw-r-- 1 zhangsan zhangsan 446 Aug 27 15:42 code.s -rw-rw-r-- 1 zhangsan zhangsan 149 Aug 27 15:42 Makefile [zhangsanhcss-ecs-f571 dir1]$可以看到make会根据Makefile中的依赖关系进行推导直到推导出目标文件可以看到是一个栈的结构称之为推到栈。先根据依赖方法入栈然后依次出栈3.2PHONY项目清理Makefile 1 code:code.c 2 gcc -o code code.c 3 4 .PHONY:clean 5 clean: 6 rm -f code• 工程是需要被清理的• 像clean这种没有被第一个目标文件直接或间接关联那么它后面所定义的命令将不会被自动执行不过我们可以显示要make执行。即命令⸺“make clean”以此来清除所有的目标文件以便重编译。• 但是一般我们这种clean的目标文件我们将它设置为伪目标,用 .PHONY修饰,伪目标的特性是总是被执行的。[zhangsanhcss-ecs-f571 dir1]$ make clean rm -f code [zhangsanhcss-ecs-f571 dir1]$ ll total 8 -rw-rw-r-- 1 zhangsan zhangsan 76 Aug 27 14:53 code.c -rw-rw-r-- 1 zhangsan zhangsan 65 Aug 27 16:10 Makefile [zhangsanhcss-ecs-f571 dir1]$为什么第一次的make后面不需要跟东西呢而clean 需要make clean因为make默认执行前面第一个命令Makefile文件Makefile 1 .PHONY:clean 2 clean: 3 rm -f code 4 5 eode:code.c 6 gcc -o code code.c 7make默认执行第一个命令[zhangsanhcss-ecs-f571 dir1]$ make rm -f code为什么PHONY总是被执行.PHONY: 让make忽略源文件和可执行目标文件的Modify时间对比默认是根据时间对比文件内容不变就只执行一次。而.PHONY可以让make忽略源文件和可执行目标文件的Modify时间对比4.实用语法得会1.在依赖语句前面加上可以使语句不用回显。code:code.c gcc -o code code.c .PHONY:clean clean: rm -f code没有回显[zhangsanhcss-ecs-f571 dir1]$ vim Makefile [zhangsanhcss-ecs-f571 dir1]$ ll total 20 -rwxrwxr-x 1 zhangsan zhangsan 8360 Aug 27 16:32 code -rw-rw-r-- 1 zhangsan zhangsan 76 Aug 27 14:53 code.c -rw-rw-r-- 1 zhangsan zhangsan 82 Aug 27 16:32 Makefile2.可以定义变量Makefile文件1 BINcode 2 SRCcode.c 3 4 5 $(BIN):$(SRC) #提取内容 6 gcc -o code code.c 7 8 .PHONY:clean 9 clean: 10 rm -f $(BIN) 11 12可以正常运行[zhangsanhcss-ecs-f571 dir1]$ make [zhangsanhcss-ecs-f571 dir1]$ ll total 20 -rwxrwxr-x 1 zhangsan zhangsan 8360 Aug 27 16:42 code -rw-rw-r-- 1 zhangsan zhangsan 76 Aug 27 14:53 code.c -rw-rw-r-- 1 zhangsan zhangsan 121 Aug 27 16:41 Makefile [zhangsanhcss-ecs-f571 dir1]$依赖关系也可以替换1 BINcode 2 SRCcode.c 3 4 5 $(BIN):$(SRC) #提取内容 6 gcc -o $ $^ #对应目标文件^对应源文件,$取里面的内容 7 8 .PHONY:clean 9 clean: 10 rm -f $(BIN)[zhangsanhcss-ecs-f571 dir1]$ make [zhangsanhcss-ecs-f571 dir1]$ ll total 20 -rwxrwxr-x 1 zhangsan zhangsan 8360 Aug 27 16:49 code -rw-rw-r-- 1 zhangsan zhangsan 76 Aug 27 14:53 code.c -rw-rw-r-- 1 zhangsan zhangsan 181 Aug 27 16:48 Makefile当有多个源文件时创建100个源文件[zhangsanhcss-ecs-f571 dir1]$ touch src{1..100}.c自动获取.c为后缀的文件2 SRC$(shell ls *.c)最佳实践用这个3 SRC$(wildcard *.c) #wildcard函数获取当前目录下的所有的.c源文件实用语法4 OBJ$(SRC:.c.o) #语法把文件的.c后缀改成.o后缀处理多个.c文件时先统一处理成.o文件最后再一起链接。Makefile文件中的内容1 BINcode 2 SRC$(wildcard *.c) 3 OBJ$(SRC:.c.o) 4 5 $(BIN):$(OBJ) 6 gcc -o $ $^ 7 echo -----$^ to $---- 8 %.o:%.c #可以展开文件 9 gcc -c $ #可以依次取出源文件 10 echo .....$- to $.....最终模式1 BINcode 2 SRC$(wildcard *.c) 3 OBJ$(SRC:.c.o) 4 CCgcc 5 Echoecho 6 Rmrm -rf 7 8 9 $(BIN):$(OBJ) 10 $(CC) -o $ $^ 11 $(Echo) linking $^ to $ ... done 12 %.o:%.c #可以展开文件 13 $(CC) -c $ #可以依次取出源文件 14 $(Echo) compling $ to $ ... done 15 16 .PHONY:clean 17 clean: 18 $(Rm) $(BIN) $(OBJ)5.细节make的执行规则是只生成所有目标对象中的第一个当然make会根据语法规则递归生成第一个目标对象的所有依赖对象后再回头生成第一个目标对象生成后退出。make在执行makefile规则中根据语法规则会分析目标对象与依赖对象的时间信息判断是否在上一次生成后源文件发生了修改若发生了修改才需要重新生成。makefile中的伪对象表示对象名称并不代表真正的文件名与实际存在的同名文件没有相互关系因此伪对象不管同名目标文件是否存在都会执行对应的生成指令。伪对象的作用有两个1. 使目标对象无论如何都要重新生成。2. 并不生成目标文件而是为了执行一些指令。makefile中使用 .PHONY 来声明伪对象 .PHONY: clean。makefile文件中保存了编译器和链接器的参数选项并且描述了所有源文件之间的关系。make程序会读取makefile文件中的数据然后根据规则调用编译器汇编器链接器产生最后的输出。Makefile里主要包含了五个东西显式规则、隐晦规则、变量定义、文件指示和注释。显式规则说明了如何生成一个或多个目标文件。make有自动推导的功能所以隐晦的规则可以让我们比较粗糙地简略地书写makefile比如源文件与目标文件之间的时间关系判断之类。在makefile中可以定义变量当makefile被执行时其中的变量都会被扩展到相应的引用位置上通常使用 $(var) 表示引用变量。文件指示。包含在一个makefile中引用另一个makefile类似C语言中的include;注释makefile中可以使用 # 在行首表示行注释。默认的情况下make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件。

相关新闻

成都企业网站建设费用到底多少?揭秘隐形坑点,看完省下大几万

成都企业网站建设费用到底多少?揭秘隐形坑点,看完省下大几万

别一听到“建站”就脑子里全是几万块,也别信那些几百块包干的神话。这篇直接告诉你,在成都做企业官网,钱到底花在哪,怎么避坑才能不交智商税。很多老板找我聊建站,第一句话就是:“成都企业网站建设费用大概要多少?” 我通常反问一句:“你想让网站变成什么样?” 对方往…

发布时间:2026/7/10 15:41:23
别装了,网站建设公司生存现状就是卷到没朋友

别装了,网站建设公司生存现状就是卷到没朋友

今天想聊点扎心的。 真的,不吹不黑。 最近跟几个做建站的朋友喝酒。 大家都不说话。 就喝酒。 因为心里苦啊。你知道现在这行有多难吗? 以前做个网站,收个三五万。 现在? 两千块全包。 还送域名送空间。 甚至还有人免费做。 就为了混个脸熟。 或者为了引流。 这哪是做生意。…

发布时间:2026/7/10 15:41:15
免费教育网站建设靠谱吗?老程序员掏心窝子告诉你真相与坑

免费教育网站建设靠谱吗?老程序员掏心窝子告诉你真相与坑

你是不是也想搞个免费教育网站建设,结果发现全是坑?这篇文直接告诉你咋避坑,别花冤枉钱还耽误事。看完这篇,你心里就有底了,知道该选啥不该选啥。说实话,刚入行那会儿,我也觉得“免费”俩字特诱人。 谁不想白嫖呢? 尤其是做教培的,预算本来就紧,能省一点是一点。 但我…

发布时间:2026/7/10 15:41:14
深圳网站建设代理怎么选才不踩坑?揭秘那些没人告诉你的隐形成本

深圳网站建设代理怎么选才不踩坑?揭秘那些没人告诉你的隐形成本

本文关键词:深圳网站建设代理找深圳网站建设代理,真的挺让人头大的。市面上报价从几千到几万都有。很多老板一开始只看价格。觉得便宜就是硬道理。结果呢?后期全是坑。今天咱们不聊虚的。就聊聊怎么挑个靠谱的团队。首先,别迷信“模板建站”。虽然快,但千篇一律。你的品牌…

发布时间:2026/7/10 16:43:08
金华网站建设明细报价表到底怎么算?老板们别被坑了,看完这篇再掏钱

金华网站建设明细报价表到底怎么算?老板们别被坑了,看完这篇再掏钱

本文关键词:金华网站建设明细报价表最近好多金华本地的老板私信我,问起金华网站建设明细报价表的事情。说实话,这行水太深了,报价从几千到几万都有,如果不搞清楚里面的门道,很容易花冤枉钱。我在这行摸爬滚打也有七八年了,见过太多因为贪便宜最后网站打不开,或者因为太…

发布时间:2026/7/10 16:42:52
Sadcloud配置指南:如何启用特定AWS服务的漏洞场景进行渗透测试

Sadcloud配置指南:如何启用特定AWS服务的漏洞场景进行渗透测试

Sadcloud配置指南:如何启用特定AWS服务的漏洞场景进行渗透测试 【免费下载链接】sadcloud A tool for standing up (and tearing down!) purposefully insecure cloud infrastructure 项目地址: https://gitcode.com/gh_mirrors/sa/sadcloud Sadcloud是一款专…

发布时间:2026/7/10 16:43:28
揭秘中国水电建设集团港航建设有限公司网站:不只是查资质,更是看懂大国重器的底气

揭秘中国水电建设集团港航建设有限公司网站:不只是查资质,更是看懂大国重器的底气

很多人对央企的印象,还停留在“高大上”和“遥不可及”。其实,真正的实力,往往藏在细节里。今天,咱们不聊虚的。直接聊聊如何通过中国水电建设集团港航建设有限公司网站,看透一家顶级企业的硬核底色。别以为这只是个展示窗口的网页。对于懂行的人来说,这是一本活生生的“…

发布时间:2026/7/10 16:42:37
揭秘营销型网站的建设重点是什么,老板别再花冤枉钱建展示页了

揭秘营销型网站的建设重点是什么,老板别再花冤枉钱建展示页了

你是不是也遇到过这种情况?花了几万块做个高大上的官网,结果客户进来转了一圈,连个电话都没留?别急,今天咱们就聊聊这个痛点。这篇内容直接告诉你,营销型网站的建设重点是什么,帮你把流量变成真金白银。很多老板有个误区,觉得网站好看就是好网站。其实那是给老板自己看…

发布时间:2026/7/10 16:42:00
别被忽悠了!网站建设正版软件到底值不值得掏这个真金白银

别被忽悠了!网站建设正版软件到底值不值得掏这个真金白银

今天咱不整那些虚头巴脑的官方话术。我就想问问,做网站的时候,你是不是也见过那种报价低得离谱的方案?几百块给你搭个站,用个所谓的“免费”模板,后台全是乱码,打开还慢得像蜗牛。我当时就火了,这哪是建站,这简直是给自家大门上挂了个炸弹。很多人觉得,软件嘛,能跑就…

发布时间:2026/7/10 16:41:47
老板们别被忽悠了,企业网站建设费用摊销到底怎么算才不亏?

老板们别被忽悠了,企业网站建设费用摊销到底怎么算才不亏?

说实话,每次听到老板们拍着桌子问“做个网站要多少钱”,我心里就直犯嘀咕。你们关心的根本不是网站好不好用,而是这钱花得值不值,能不能立马变出利润来。我见过太多公司,花个三五万做个花里胡哨的首页,结果后台乱成一锅粥,SEO标签全没填,上线半年连个蜘蛛都不爬。这种钱…

发布时间:2026/7/10 0:00:19
网站搜索建设怎么做?新手避坑指南与实战心得

网站搜索建设怎么做?新手避坑指南与实战心得

很多老板做网站,花大价钱搞设计,最后发现用户根本找不到内容,搜索功能形同虚设。这篇干货不讲虚的,直接告诉你怎么搭建一个真正好用的站内搜索,解决用户找不到东西、跳出率高的问题。上周我去了一家做高端家具的电商网站。页面确实漂亮,极简风,高级感拉满。但是,我想找…

发布时间:2026/7/10 0:00:33
北京市建设工程质量监督网站查询实操指南与避坑实录

北京市建设工程质量监督网站查询实操指南与避坑实录

做工程最怕什么?怕验收不过,怕资料补不齐,怕最后拿着钱还背一身债。这篇不整虚的,直接告诉你怎么通过北京市建设工程质量监督网站搞定验收流程,以及那些没人愿意告诉你的隐形坑。先说个真事儿。上个月有个做装修的朋友,急着拿竣工验收备案表,结果在北京市建设工程质量监…

发布时间:2026/7/10 0:00:37
做个人信息管理网站建设,这3个坑我踩了七年,你千万别再跳

做个人信息管理网站建设,这3个坑我踩了七年,你千万别再跳

做了七年建站,见过太多老板花大钱买模板,最后发现根本没法用。特别是现在大家都讲究数据隐私,想搞个个人信息管理网站建设,结果越搞越乱。这篇文不整虚的,直接说怎么把这套系统落地,让你自己的数据真正听话。先说个真事儿。去年有个做自由职业的朋友找我,他说想建个网站…

发布时间:2026/7/10 15:55:18
杨凌规划建设局网站怎么查最新规划?老杨说点大实话

杨凌规划建设局网站怎么查最新规划?老杨说点大实话

杨凌规划建设局网站你是不是也遇到过这种情况?想看看自家旁边要修路,还是建公园。翻遍了手机,搜出来的全是几年前的旧闻。或者好不容易找到个入口,页面加载慢得像蜗牛。心里那个急啊,真的,懂的人都懂。我是老杨,在杨凌混了十几年,跟这行打交道不少。今天不跟你扯那些虚…

发布时间:2026/7/9 15:43:42
杭州网站建设 seo 避坑指南:别被那些只会套模板的忽悠了

杭州网站建设 seo 避坑指南:别被那些只会套模板的忽悠了

昨天半夜两点,我还在改一个客户的后台,咖啡都凉透了。这哥们儿是做机械配件的,在余杭那边,找的前一家公司花了八千块做了个站,结果上线一个月,百度连个影子都没有。他急得给我打电话,说是不是被黑了。我让他把链接发过来,打开一看,好家伙,那代码乱得跟刚被猫抓过的毛…

发布时间:2026/7/9 16:54:10
建站7年才悟出的网站建设思路,别再花冤枉钱了

建站7年才悟出的网站建设思路,别再花冤枉钱了

做建站这行整整7年了。 见过太多老板花几万块, 最后做出来的网站像个垃圾场。 今天不整那些虚头巴脑的术语。 就聊聊我踩过的坑, 和真正能落地的网站建设思路。很多老板一上来就问: “多少钱能做个高大上的?” 我通常直接劝退。 因为方向错了, 你给再多钱也是打水漂。 真正…

发布时间:2026/7/9 15:45:02
合肥的网站建设避坑指南:别被低价忽悠,这3个细节决定生死

合肥的网站建设避坑指南:别被低价忽悠,这3个细节决定生死

做企业官网最怕什么?不是技术难,是交钱后没人管,或者上线一个月连个访客都没有。这篇东西不扯虚的,直接告诉你怎么在合肥找个靠谱的团队,或者自己怎么避坑。先说个大实话,我在合肥混这行五年多,见过太多老板因为贪便宜吃大亏。你去百度搜“合肥的网站建设”,出来一堆报…

发布时间:2026/7/9 15:44:20
别被忽悠了!德州网站建设那些坑,我拿真金白银换来的教训

别被忽悠了!德州网站建设那些坑,我拿真金白银换来的教训

做这行久了,心里就憋着一股火。每次看到客户拿着网上抄来的模板,问我能不能做成“苹果官网”那种效果。我就想笑。真的,太想笑了。今天咱不整那些虚头巴脑的专业术语。就聊聊德州网站建设里,那些让人头秃的真实事儿。我有个客户,老张。他是做德州本地建材的,实在人。当初…

发布时间:2026/7/9 15:45:20