热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux学习笔记——例说makefile单个C文件

0.前言从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借助博
0.前言     从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力。所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法。     例说makefile分为以下几个部分,更多内容请参考【例说makefile索引博文】    1.只有单个C文件        2.含有多个C文件         3.需要包括头文件路径    4.增加宏定义    5.增加系统共享库    6.增加自定义共享库    7.一个实际的例子
    【代码仓库】——makefile-example     代码仓库位于bitbucket,可借助TortoiseHg(GUI工具)克隆代码或者在网页中直接下载zip包。
1.复习gcc指令     一个非常简单的C文件——test.c     【test.c】
#include int main(void)
{
int a = 3;
int b = 2;

printf("a=%d\n",a);
printf("b=%d\n",b);
return 0;
}
    【最简单方法】     gcc test.c -o test     最终生成可执行文件test     【执行test】     ./test     【输出结果】     a=3     b=5          【不正确的写法】     请注意以下写法并不正确。     gcc -c test.c -o test
    【详细步骤分解】编译——链接     无论gcc指令的参数如何变化,从源文件变为可执行文件只需要两步,第一步源文件编译为目标文件,第二步从目标文件链接为可执行文件。在最简单的指令——gcc test.c -o test中使用了一处GCC的隐含规则,所有编译和链接这两个关键步骤展现的不明显。那么下面通过指令让“不明显”变得“明显”。 【1】由c文件编译为目标文件     【写法1】     gcc -c test.c -o test.o     【写法2】——顺序可以颠倒     gcc -o test.o -c test.c     【写法3】——适当简写     可以适当简写,充分利用GCC的默认规则,*.o文件由同名的*.c文件编译得到。     gcc -c test.c     【写法4】——有点奇怪     还可以这样写,虽然看起来有点奇怪,但只执行结果却是一样的。makefile文件似乎更喜欢这种方式。     gcc -c -o test.o test.c
【2】把目标文件链接为可执行文件     【写法1】     gcc test.o -o test     【写法2】——顺序可以颠倒     顺序可以颠倒,makefile文件似乎更喜欢这种方式。     gcc -o test test.o
2.编写makefile文件     【makefile】     请替换其中的[tab],并以代码仓库中的makefile文件为主。
# 可执行文件TARGET = test# 依赖目标OBJS = test.o# 指令编译器和选项CC=gccCFLAGS=-Wall -std=gnu99$(TARGET):$(OBJS)# @echo TARGET:$@# @echo OBJECTS:$^ [tab]$(CC) -o $@ $^clean: [tab]rm -rf $(TARGET) $(OBJS)

    【具体说明】     【1】TARGET=test test为最后可执行文件,linux中的可执行文件就是windows中的exe文件     【2】OBJS = test.o test.o对应test.c,利用makefile的隐含规则,test.o由test.c编译得到。     【3】CC=gcc 指定编译器为gcc     【4】CFLAGS=-Wall -std=gnu99 使能所有警告,指定编译器标准为gnu99     【5】 $(CC) -o $@ $^              $@和$^为自动化变量,$@指目标文件,此处为可执行文件test,$^指去除重复的依赖文件,此处为test.o             $(CC) -o $@ $^ 最终变化为 gcc -o test test.o。gcc -o test test.o和【详细步骤】链接部分的指令完全相同。那么makefile和gcc指令便建立了联系。             可以通过@echo指令在makefile执行过程中打印自动化变量,通过这种方式调试makefile加速错误修正。
    【编译】     make clean && make     先执行make clean再执行make生成可执行文件
    【控制台输出】 gcc -Wall -std=gnu99 -c -o test.o test.c gcc -o test test.o
    【分析】     若去除-Wall -std=gnu99,那么以上两句简化为 gcc -c -o test.o test.c 和编译过程方法【4】相同gcc -o test test.o       和执行过程方法【2】相同      那么makefile和gcc指令便建立了关系,理解起来也方便多了。          
3.再完善一些     【makefile】     请替换其中的[tab],并以代码仓库中的makefile文件为主
# 可执行文件TARGET=test# C文件SRCS = test.c# 目标文件OBJS = $(SRCS:.c=.o)# 指令编译器和选项CC=gccCFLAGS=-Wall -std=gnu99$(TARGET):$(OBJS)#@echo TARGET:$@#@echo OBJECTS:$^ [tab]$(CC) -o $@ $^clean: [tab]rm -rf $(TARGET) $(OBJS)%.o:%.c [tab]$(CC) $(CFLAGS) -o $@ -c $<
    【变化说明】     【1】OBJS = $(SRCS:.c=.o) 变量替换函数,把所有的*.c文件替换为*.o文件。该函数和             OBJS = $(patsubst %.c,%.o,$(SRCS))具有相同效果。     【2】$<为自动化变量,指第一个目标文件,此处为test.c             替换变量和自动化变量之后:             test.o:test.c             [tab]gcc -Wall -std=gnu99 -o test.o -c test.c
4.总结     【1】gcc指令执行顺序——先编译目标文件,后链接成可执行文件     【2】自动化变量             $@ 当前规则的目标文件             $<第一个依赖文件             $^ 去除重复的所有依赖文件

  
推荐阅读
  • 本文详细介绍了如何在Linux系统中搭建51单片机的开发与编程环境,重点讲解了使用Makefile进行项目管理的方法。首先,文章指导读者安装SDCC(Small Device C Compiler),这是一个专为小型设备设计的C语言编译器,适合用于51单片机的开发。随后,通过具体的实例演示了如何配置Makefile文件,以实现代码的自动化编译与链接过程,从而提高开发效率。此外,还提供了常见问题的解决方案及优化建议,帮助开发者快速上手并解决实际开发中可能遇到的技术难题。 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • 本文介绍了C语言中指针的基础知识及其初步应用。首先,文章详细解释了如何定义变量和指针,例如通过 `int i, j, k;` 定义整型变量,以及使用 `int *pi, *pj, *pk;` 来声明指向整型数据的指针。接着,探讨了变量和指针的初始化方法,强调了正确的初始化对于避免程序错误的重要性。此外,还简要介绍了指针在数组、函数参数传递等场景中的基本应用,为初学者提供了全面的入门指导。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 计算 n 叉树中各节点子树的叶节点数量分析 ... [详细]
  • 在进行网络编程时,准确获取本地主机的IP地址是一项基本但重要的任务。Winsock作为20世纪90年代初由Microsoft与多家公司共同制定的Windows平台网络编程接口,为开发者提供了一套高效且易用的工具。通过Winsock,开发者可以轻松实现网络通信功能,并准确获取本地主机的IP地址,从而确保应用程序在网络环境中的稳定运行。此外,了解Winsock的工作原理及其API函数的使用方法,有助于提高开发效率和代码质量。 ... [详细]
  • BZOJ4240 Gym 102082G:贪心算法与树状数组的综合应用
    BZOJ4240 Gym 102082G 题目 "有趣的家庭菜园" 结合了贪心算法和树状数组的应用,旨在解决在有限时间和内存限制下高效处理复杂数据结构的问题。通过巧妙地运用贪心策略和树状数组,该题目能够在 10 秒的时间限制和 256MB 的内存限制内,有效处理大量输入数据,实现高性能的解决方案。提交次数为 756 次,成功解决次数为 349 次,体现了该题目的挑战性和实际应用价值。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • 如何判断一个度序列能否构成简单图——哈维尔-哈基米算法的应用与解析 ... [详细]
  • 如何利用C语言进行高效的商品管理程序设计与开发
    本文详细探讨了使用C语言高效开发商品管理系统的技巧与方法。通过简洁明了的代码示例,文章逐步引导读者掌握商品管理程序的设计与实现,适合初学者及有一定基础的开发者参考学习。 ... [详细]
  • 本文首先对信息漏洞的基础知识进行了概述,重点介绍了几种常见的信息泄露途径。具体包括目录遍历、PHPINFO信息泄露以及备份文件的不当下载。其中,备份文件下载涉及网站源代码、`.bak`文件、Vim缓存文件和`DS_Store`文件等。目录遍历漏洞的详细分析为后续深入研究奠定了基础。 ... [详细]
  • 本文详细探讨了C语言中`extern`关键字的简易编译方法,并深入解析了预编译、`static`和`extern`的综合应用。通过具体的代码示例,介绍了如何在不同的文件之间共享变量和函数声明,以及这些关键字在编译过程中的作用和影响。文章还讨论了预编译过程中宏定义的使用,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
author-avatar
只想活得快乐的魔羯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有