Makefile简明教程

        Linux的项目管理器Make类似于Windows中VC里的“工程”,它是个"自动编译管理器",能根据文件的时间戳自动发现更新过的文件而减少编译量。通过读入Makefile文件的内容来执行大量的编译工作,用户只需编写一次简单的编译语句就可以了。它提高了实际项目的工作效率,几乎所有Linux下的项目编程都会用到它。

        在如何写Makefile之前,我们首先看下Make工作时的流程:

             1)读入所有的Makefile文件;

             2)如果该Makefile文件通过include包含其他Makefile文件,则读入被包含的Makefile文件;

             3)初始化文件中的变量;

             4)推到隐晦规则,并分析所有规则;

             5)为所有目标文件创建依赖关系链;

             6)根据依赖关系,决定哪些目标要重新生成;

             7)执行生成命令。

        如果定义的变量被使用了,Make采用拖延战术,若变量出现在依赖关系的额规则中,仅当这条依赖被决定要使用时,变量才会在内部展开。

                                                                                                                                                                                                                                                                                                                        

Makefile文件的编写

Makefile 中的第一个目标会被作为其默认目标。

目标、依赖、命令的书写格式为

targets:prerequisites
TAB command
#这种方式居多,command前用tab键对齐

targets:prerequisites ; command
command

       没有依赖文件的目标称为“伪目标”。它只是一个标签不是一个文件。make无法生成它的依赖关系和决定它是否要执行。所以我们只能显式的指明这个“目标”才能让其生效——即通过make+ 伪目标名显示的调用让它得到执行。

       为避免伪目标和文件重名的情况,可以用".PHONY"这个特殊的标记指明一个伪目标。不管有无这个文件,这个目标都是伪目标。

 .PHONY:clean
clean:
        rm -f *.o
 //无论clean文件是否存在,clean就是一个伪目标 

        当然"伪目标"也可以有依赖文件,伪目标同样可以作为“默认目标”,只要将其放在第一个。一个示例就是,如果你的 Makefile 需要一口气生成若干个可执行文件,但你只想简单地敲一个 make 完事,并且,所有的目标文件都写在一个 Makefile 中,那么你可以使用“伪目标”这个特性:

all : prog1 prog2 prog3
.PHONY : all
prog1 : prog1.o
        cc -o prog1 prog1.o
prog2 : prog2.o
        cc -o prog2 prog2.o
prog3 : prog3.o
        cc -o prog3 prog3.o 

       现在我以数据结构C语言实现——顺序线性表SqList这篇博文中的源文件为例,先给出它的Makefiel文件。四个源文件declaration.h、function.h、function.c、main.c

main:main.o function.o
	gcc -o main main.o function.o
main.o:main.c function.h declaration.h
	gcc -c main.c
function.o:function.c function.h declaration.h
	gcc -c function.c
.PHONY:clean
clean:
	rm *.o
	
        这是一个很常规的写法,我们再来将他进一步优化。

        使用变量

         Makefile中的变量分为用户自定义变量、预定义变量、自动变量及环境变量。预定义变量及自动变量部分都默认值但也可修改。Makefile中常见的预定义变量如下:

CC——C编译器的名称,默认为cc

CPP——C编译器的名称,默认为$(CC) -E

CXX——C++编译器的名称,默认为g++

RM——文件删除程序的名称,默认为rm -f

 CFLAGS——C编译器的选项无默认值
//变量在声明的时候要赋初值。使用时变量名前加"$",最后用"()"或"{}"将变量名括起来,"$$"表示真实的"$"符号。
 

//若规则命令中有SHELL变量,引用使用Shell的“$temp”格式

        使用自动引导

让Makefile自动推导,只要看到.o文件,它就会自动的把对应的.c文件加到依赖文件中,并且gcc -c *.c也会被推导出来。简化如下

CC=gcc
OBJ=main.o function.o
RM=rm -f
make:$(OBJ)
	$(CC) -o main $(OBJ)
main.o:declaration.h function.h
function.o:function.h declaration.h
.PHONY:clean
clean:
	$(RM) $(OBJ)

        使用自动变量
<span style="color:#333333;">$@:目标文件      $^:所有的依赖文件      $<:第一个依赖文件</span>
        使用默认缺省规则

..c.o:
        gcc -c $<
这个规则表示所有的.o文件都是依赖于相应的.c文件
        使用函数
CC=gcc
RM=rm -f
CFLAGS=-Wall -c
SRCS=$(wildcard *.c)
OBJS=$(patsubst %c,%o,$(SRCS))
TARGET=main
.PHONY:all clean
all:$(TARGET)
$(TARGET):$(OBJS)
	$(CC) -o $@ $^
%.o:%.c
	$(CC) $(CFLAGS) -o $@ $<
clean:
	$(RM) *.o $(TARGET)

wildcard和patsubst函数的作用分别是扩展通配符和替换通配符,SRCS=$(wildcrad *.c)等于指定编译当前目录下所有.c文件。$(patsubst %.c,%.o ,$(SRCS))把$(SRCS)中的变量后缀是.c全部其换成.o

                                                                                                                                                                                                                                                                                                                   

指定Makefile文件

GNU make 找寻默认的 Makefile 的规则是在当前目录下依次找三个文件——“GNUmakefile”、“makefile”和“Makefile”。其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。

我们也可以自己定义Makefile文件的名字,假如有Makefile文件名为mfile,可按一下方式执行

make -f mfile/make --file mfile




### 回答1: CMake是一种跨平台的自动化构建工具,它可以帮助程序员在不同的操作系统和编译器上构建和测试软件项目。以下是一个简明的CMake教程: 1. 首先,安装CMake。在Linux系统上,可以使用包管理器进行安装。例如,在Ubuntu系统上,可以使用以下命令安装CMake: ``` sudo apt-get install cmake ``` 2. 创建一个新的工作目录,并进入该目录。假设该目录的名称为“my_project”。 ``` mkdir my_project cd my_project ``` 3. 在工作目录中创建一个CMakeLists.txt文件,并将以下内容添加到文件中: ``` cmake_minimum_required(VERSION 3.5) project(my_project) add_executable(my_executable main.cpp) ``` 4. 在工作目录中创建一个源代码文件main.cpp,该文件将包含应用程序的主要功能。 5. 执行以下命令生成Makefile并编译程序: ``` cmake . make ``` 6. 编译完成后,运行可执行文件: ``` ./my_executable ``` 这是一个非常简单的CMake教程,仅仅介绍了如何使用CMake构建一个简单的应用程序。对于更复杂的项目,可能需要更详细的CMake配置。 ### 回答2: CMake是一种跨平台的编译程序,它可以自动生成Makefile和Visual Studio工程文件,支持Windows、Mac OS X和Linux等操作系统。本文将简要介绍在Linux下使用CMake的方法。 1. 安装CMake 在Linux下,你可以通过包管理器来安装CMake。 在Debian/Ubuntu系统中安装CMake sudo apt-get install cmake 在Fedora系统中安装CMake sudo dnf install cmake 在CentOS系统中安装CMake sudo yum install cmake 在Arch Linux系统中安装cmake sudo pacman -S cmake 2. 编写CMakeLists.txt文件 CMakeLists.txt是CMake的配置文件,用于指示CMake如何构建项目。 在你的项目根目录下创建CMakeLists.txt文件。 下面是一个示例CMakeLists.txt文件: cmake_minimum_required(VERSION 2.8) project(myproject) set(CMAKE_CXX_STANDARD 11) add_executable(myapp main.cpp) 3. 构建项目 在终端中,使用cd命令进入到你的项目目录中,然后创建build目录,在build目录下执行cmake命令。 mkdir build cd build cmake .. 执行完cmake命令后,CMake会根据你的CMakeLists.txt文件生成一些Makefile或Visual Studio工程文件。 在Linux系统中,你可以使用make工具来构建项目: make 4. 运行项目 在终端中,进入到build目录下,执行生成的可执行文件即可: cd build ./myapp 这就是在Linux下使用CMake的简单教程。CMake可以帮助你轻松地构建项目,同时还支持多种操作系统和编译器平台,是一款非常方便的编译器工具。 ### 回答3: CMake是一个跨平台的自动化构建系统,提供了一种类似Makefile的配置文件,可以生成针对各种编译器的本地化makefile和其它构建系统文件。它能够简化开发和构建过程,使用户可以在多种不同的平台、编译器和操作系统上实现跨平台的构建。 CMake是在Linux中使用的非常流行的构建系统,下面是CMake简明教程: 1.安装CMake 使用以下命令安装CMake: sudo apt-get install cmake 2.建立项目目录 在自己的工作目录下新建一个子目录,并进入该目录。 3.创建CMakeLists.txt文件 在该目录下创建一个名为CMakeLists.txt的文件,这是CMake的核心文件,它定义了项目的编译、构建过程和依赖关系等。 4.添加源文件 在CMakeLists.txt文件中添加源文件。源文件是指程序的源代码文件,包括头文件和源文件。 5.指定可执行文件名称 在CMakeLists.txt文件中指定可执行文件的名称,使用add_executable命令即可。例如: add_executable(test test.c) 6.添加库文件和依赖库 在CMakeLists.txt文件中添加需要的库文件及其依赖库,使用target_link_libraries命令即可。例如: target_link_libraries(test pthread) 7.编译项目 在项目目录下执行以下命令: mkdir build cd build cmake .. make 8.运行程序 在build目录下可以找到可执行文件,使用以下命令运行程序: ./test 总结:上述为一个简单的CMake教程,可以帮助开发者理解如何使用CMake管理项目,并且可以通过这个教程的基础上更加深入的学习CMake,在将来的开发中更加灵活、高效的使用CMake来构建项目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值