MakeFile和CMakeList有什么区别?
Makefile 和 CMakeLists.txt 是两种不同的构建系统,都是用来管理软件项目构建过程中的各个任务。
Makefile是一种基于文本的构建系统,它描述了项目的构建步骤,通常使用简单的语法指令来自动构建项目。Makefile是被广泛应用于Unix系统上的开源项目中,它是非常灵活和可扩展的,但是写起来有点困难,尤其是对于复杂的项目。
CMakeLists.txt是一种基于CMake的构建系统,它使用一种高级的语言描述项目的构建步骤,CMake可以根据操作系统和编译器环境自动生成相应的Makefile或其他构建系统文件。CMake是跨平台的,可以轻松地构建在各种操作系统和编译器环境中的项目,写起来也比较简单。
总的来说,如果您正在管理一个小型的项目,并且您很熟悉Makefile的语法,那么您可以使用Makefile来构建您的项目。但是,如果您正在管理一个大型的跨平台项目,那么您可能应该使用CMakeLists.txt来构建您的项目,因为它更加灵活.
话不多说,直接上代码!!
# 目标文件
TARGET = hello
# 编译器
CC = gcc
# 编译选项
CFLAGS = -Wall -O2
# 目标文件依赖的源文件
SOURCES = hello.c
# 构建目标
$(TARGET): $(SOURCES)
$(CC) $(CFLAGS) -o $(TARGET) $(SOURCES)
# 清除中间文件
.PHONY: clean
clean:
rm -f $(TARGET)
示例中的Makefile构建了一个叫做"hello"的程序,它依赖于名为"hello.c"的源文件。编译器是gcc,编译选项是"-Wall -O2"。使用"make"命令构建目标,使用"make clean"清除中间文件。(注意到上面代码中的.PHONY)
.PHONY是什么意思?
".PHONY"是在Makefile中的一个关键字,它用于指示Makefile中某个目标不是文件,而是一个虚拟目标。虚拟目标不会生成文件,而是触发执行其他操作,如调用命令或运行其他目标。
在这个例子中,"clean"是一个虚拟目标,执行"make clean"命令时,它会删除当前目录下的所有".o"文件。
使用".PHONY"可以防止当存在同名文件时,Makefile误判目标已经生成,从而避免错误的操作。
来点进阶用法吧!
# 目标文件
TARGET = program
# 编译器
CC = gcc
# 编译选项
CFLAGS = -Wall -O2
# 目标文件依赖的源文件列表
SOURCES = main.c helper.c
# 头文件路径
INCLUDES = -I./include
# 库文件路径
LDFLAGS = -L./lib
# 链接库
LIBS = -lm
# 构建目标
$(TARGET): $(SOURCES)
$(CC) $(CFLAGS) $(INCLUDES) -o $(TARGET) $(SOURCES) $(LDFLAGS) $(LIBS)
# 清除中间文件
.PHONY: clean install uninstall
clean:
rm -f $(TARGET)
# 安装
install:
cp $(TARGET) /usr/local/bin
# 卸载
uninstall:
rm -f /usr/local/bin/$(TARGET)
在这个示例中,我们构建了一个名为"program"的程序,它依赖于两个源文件:"main.c"和"helper.c",并链接到名为"libm"的库。编译选项、头文件路径、库文件路径和链接库也被指定。使用"make"命令构建目标,使用"make clean"清除中间文件,使用"make install"安装程序,使用"make uninstall"卸载程序。