Makefile
- 1.举一个Makefile的例子
- 2.使用变量
- 3.更省事的方式,让Make 自动推导
- .PHONY:clean是什么意思?!
- 4.cmake与Makefile的联系
- 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
1.举一个Makefile的例子
hello_demo : hellospeak.o speak.o
gcc -o hello_demo hellospeak.o speak.o
hellospeak.o : hellospeak.c speak.h
gcc -c hellospeak.c
speak.o : speak.c speak.h
gcc -c speak.c
clean :
rm hello_demo speak.o hellospeak.o
2.使用变量
objects = hellospeak.o speak.o
hello_demo : $(objects)
gcc -o hello_demo $(objects)
hellospeak.o : hellospeak.c speak.h
gcc -c hellospeak.c
speak.o : speak.c speak.h
gcc -c speak.c
clean :
-rm hello_demo $(objects)
3.更省事的方式,让Make 自动推导
潜规则:比如:helloworld.c 默认就是由helloworld.o生成
以下#注释掉的内容都可以由 $(objects):speak.h 替代
objects = hellospeak.o speak.o
hello_demo : $(objects)
gcc -o hello_demo $(objects)
$(objects):speak.h
#hellospeak.o : hellospeak.c speak.h
# gcc -c hellospeak.c
#speak.o : speak.c speak.h
# gcc -c speak.c
.PHONY : clean
clean :
-rm hello_demo $(objects)
.PHONY:clean是什么意思?!
.PHONY : clean
clean :
-rm hello_demo $(objects)
与
clean :
-rm hello_demo $(objects)
的区别
在Makefile中,.PHONY关键字用于声明一个伪目标,表示该目标不是真正的文件名,而是一个伪目标,用于在执行Makefile时指定需要执行的操作。在这个例子中,.PHONY : clean声明了一个伪目标clean。
在第一个规则clean中,-rm hello_demo $(objects)指定了执行rm命令来删除名为hello_demo的文件以及变量$(objects)中指定的任何文件。-符号表示在删除这些文件时忽略错误,即如果文件不存在,则不会生成错误消息,Makefile将继续执行后面的规则。
在第二个规则clean中,只有一个指令-rm hello_demo $(objects),与第一个规则相同,但没有声明clean为伪目标。这意味着如果在Makefile中存在一个名为clean的文件,则该规则将不会被执行。因此,第一个规则是更好的选择,因为它能够保证在执行make clean时始终运行规则。
4.cmake与Makefile的联系
你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。
CMake就是针对上面问题所设计的工具:CMake真正实现了跨平台。
CMake允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等 。
安装cmake: sudo apt-get install cmake
查看camke版本:cmake --version
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
- 编写 CMake 配置文件 CMakeLists.txt 。
vi CMakeList.txt
#CMakeLists.txt 基本玩法
#CMake 最低版本要求
cmake_minimum_required(VERSION 2.8)
#项目信息
project(HelloSpeak)
#指定生成的目标
add_executable(CmakeHelloSpeak speak.c hellospeak.c)
- 在终端中进入项目根目录,创建一个名为 build 的文件夹,在 build 文件夹中生成 Makefile 文件。可以使用以下命令:
mkdir build
cd build
cmake ..
其中 .. 表示上级目录,即项目根目录。
就是利用CMakeList.txt帮我们生成Makefile
- 在 build 目录中运行 make 命令来编译项目。可以使用以下命令:
make
- 可以使用以下命令运行项目:
./CmakeHelloSpeak
其中 CmakeHelloSpeak是可执行文件的名称。如果生成的是库文件,可以将其链接到其他项目中使用。
需要注意的是,CMake 是一个跨平台的构建工具,它可以生成不同平台下的不同编译器和构建系统所需的 Makefile 文件。因此,以上流程可以在不同的操作系统和编译器上使用。