C语言make和Makefile介绍及使用

yizhihongxing

C语言make和Makefile介绍及使用

什么是make

make是一种自动化编译工具,可以根据源代码和规则文件(Makefile),自动化地编译出可执行文件。make的主要优点是能够自动化编译过程,只需要更新发生改变的文件,就可以快速地编译出目标文件或可执行文件。这对于大型项目和复杂项目来说,非常有用。

Makefile介绍

在使用make时,需要编写一个规则文件,也就是Makefile。Makefile主要包括一些规则和动作,用来指示make如何生成目标文件或可执行文件。

Makefile基本格式如下:

target: dependencies
    command
  • target:target是要生成的目标文件的名称,可以是可执行文件,也可以是中间过程文件。
  • dependencies:dependencies是生成目标文件所需的依赖文件,也就是目标文件的源文件,或其生成过程的其他中间过程文件。
  • command:command是生成目标文件的具体命令。

Makefile还包括变量、条件分支、循环等语句,用来更加灵活地处理编译过程中的特殊情况。具体语法和应用请参考相关资料。

Makefile示例

以下是一个简单的Makefile示例:

CC = gcc
CFLAGS = -g -Wall

target: main.c foo.c
    $(CC) $(CFLAGS) main.c foo.c -o target

这里定义了两个变量CCCFLAGS,分别表示编译器和编译选项。接下来定义了一个目标文件target,它依赖于两个源文件main.cfoo.ccommand中,使用$(CC)$(CFLAGS)代表编译器和编译选项变量,再将两个源文件编译后链接成可执行文件。

以下是一个更复杂的Makefile示例:

CC = gcc
CFLAGS = -g -Wall
SRC_DIR = src
OBJ_DIR = obj
BIN_DIR = bin
TARGET = $(BIN_DIR)/app

SRCS = $(wildcard $(SRC_DIR)/*.c)
OBJS = $(patsubst $(SRC_DIR)/%.c, $(OBJ_DIR)/%.o, $(SRCS))

$(TARGET): $(OBJS)
    $(CC) $(CFLAGS) $^ -o $@

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@

.PHONY: clean
clean:
    rm -rf $(OBJS) $(TARGET)

这个Makefile用到了变量、条件分支、循环等语句,同时也规定了源代码、目标文件和可执行文件的存放路径。$(wildcard)函数可以用来获取某个目录下所有的以.c为后缀的文件名,$(patsubst)函数可以将每个.c源文件对应成一个.o目标文件的路径。在.PHONY声明下,我们定义了clean规则,用于清除生成的目标文件和可执行文件。

make命令示例

以下是使用make命令编译上述示例的过程:

$ cd project
$ make

执行make命令后,make会根据Makefile中定义的规则来编译源代码,并生成可执行文件。如果想要重新编译,则可以用make clean命令清除目标文件和可执行文件,再次执行make命令。

参考资料

  • GNU Make Manual: https://www.gnu.org/software/make/manual/
  • Makefile教程: https://www.ruanyifeng.com/blog/2015/02/make.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言make和Makefile介绍及使用 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 你知道如何自定义sort函数中的比较函数

    当使用sort函数对序列进行排序时,要根据具体情况实现不同的比较函数,以便sort函数能够正确地排序。在C++中,sort默认使用std::less作为比较函数,用于比较两个元素的大小关系。如果需要自定义比较函数,需要重新实现一个函数作为sort的第三个参数传入。 比较函数需要满足以下条件:1. 以两个参数为输入,返回一个bool类型的值,true表示第一个…

    C 2023年5月23日
    00
  • C++ 动态内存分配详解(new/new[]和delete/delete[])

    C++ 动态内存分配详解(new/new[]和delete/delete[]) 动态内存分配是指程序在运行期间根据需要动态地申请内存空间的过程,C++语言提供了new/new[]和delete/delete[]运算符来进行动态内存分配和释放。 动态内存分配方式 new关键字动态分配单变量内存 语法格式: new dataType; 对于上述语句,程序在运行期…

    C 2023年5月23日
    00
  • C语言字符串声明

    C语言字符串可以理解为是由若干个字符(char)组成的数组,它以null字节为结尾。在C语言中,声明字符串变量需要特殊的语法,下面是一份讲解C语言字符串声明的完整使用攻略。 声明字符串变量 在C语言中,声明字符串变量需要使用char类型以及一对双引号(“”). 这里有几个重点需要注意: 字符串中的每一个字符都分配了存储空间。 字符串末尾会自动添加一个null…

    C 2023年5月9日
    00
  • Python3 JSON 数据解析及日期和时间小结

    Python3 JSON 数据解析及日期和时间小结 JSON 数据解析 JSON 是什么? JSON(JavaScript Object Notation)是一种轻量级数据交换格式,通常用于客户端和服务器之间的数据交互。与 XML 不同,JSON 的语法简洁明了,易于读写和理解。 JSON 数据格式由两种数据结构组成: 键值对,以逗号分隔 大括号括起来的对象…

    C 2023年5月23日
    00
  • SpringBoot参数校验Validator框架详解

    完整攻略:“SpringBoot参数校验Validator框架详解” 一、介绍 SpringBoot是一个非常流行的轻量级Java开发框架,提供了很多便利的功能以及简洁的语法,使得开发者可以更加快速的进行开发。而参数校验也是开发者在开发过程中必须要面对的一项工作,为了保证程序的正确性,一些基本的参数校验是非常必要的。SpringBoot提供了一套非常方便的参…

    C 2023年5月23日
    00
  • C语言必背的一些经典程序代码实例

    下面是关于“C语言必背的一些经典程序代码实例”的详细攻略。 一、为什么要学习经典程序代码实例 首先,要了解为什么要学习经典程序代码实例。经典程序代码实例是经过大量实践、考验的优秀程序代码,不仅可以让我们了解基本的编程思路和实现方法,同时也可以拓展我们的编程思维,提高我们的编程能力。 二、经典程序代码实例的分类 常见的经典程序代码实例可以分为以下几类: 算法:…

    C 2023年5月23日
    00
  • C 程序 查找int,float,double和char的大小

    针对本题,以下是完整的使用攻略: 1. 程序说明 此 C 程序是用来查找 int、float、double 和 char 所占字节数的。字节数表示了变量所占内存的大小,了解这些对于进行内存管理和程序优化非常有帮助。 程序中使用了 sizeof() 函数,该函数可以得到变量或数据类型所占用的字节数。下面给出了具体的使用方法。 2. 程序代码 #include&…

    C 2023年5月9日
    00
  • C++ 内存分配处理函数set_new_handler的使用

    当C++程序在运行时发现内存分配失败时,会抛出一个std::bad_alloc异常。为了避免程序崩溃,我们可以使用set_new_handler函数来注册一个新的处理函数,当内存分配失败时,程序会调用该函数来处理内存分配失败的情况。 set_new_handler函数的语法 set_new_handler函数是一个全局函数,它的原型如下: std::new_…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部