目录
2.执行cmake [CMakeLists.txt所在文件夹]
1.创建makefile文件
创建三个文件
speak.h
#include<stdlib.h>
void sayHello(const char*);
speak.c
#include"speak.h"
#include<stdio.h>
void sayHello(const char* str)
{
static int count = 0;
count++;
printf("Hello %s.\n",str? str :"world");
printf("count: %d\n",count);
}
hellospeak.c
#include"speak.h"
int main(int argc, char *argv[])
{
sayHello("world");
sayHello("Airwave");
return 0;
}
编写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
使用make执行,会在当前文件中匹配makefile或者Makefile文件
2.makefile中的变量
类似c中的定义宏
变量定义: 变量名 = 值 使用shell script 的语法
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 自动推导
make很强大,它可以自动推导文件以及文件依赖关系后面的命令,于是我们就没必要去在每一个[.o]文件后都写上类似的命令,因为,我们的make会自动识别,并自己推导命令。
只要make看到一个[.o]文件,它就会自动的把[.c]文件加在依赖关系中。比如,make找到一个hello.o,那么hello.c,就会是hello.o的依赖文件。并且 gcc -c hello.c 也会被推导出来
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
clean :
rm hello_demo $(objects)
4.CMake
现在有很多Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。总之,不同的make工具最终都是生成一个makefile文件
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
在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:
- 编写 CMake 配置文件 CMakeLists.txt 。
- 执行命令 cmake PATH 生成 Makefile。其中, PATH 是 CMakeLists.txt 所在的目录。
- 使用 make 命令进行编译。
# 指定 CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)
# 为项目命名
project(MyProject)
# 添加可执行文件并指定源文件
add_executable(my_executable main.cpp)
# 可选:设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
-
cmake_minimum_required(VERSION 3.10)
: 指定 CMake 的最低版本要求。 -
project(MyProject)
: 为项目命名,可以将 "MyProject" 替换为的项目名称。 -
add_executable(my_executable main.cpp)
: 添加可执行文件,并指定源文件。假设源文件是main.cpp
,可以根据实际情况添加更多的源文件。 -
set(CMAKE_CXX_STANDARD 11)
: 设置 C++ 标准为 C++11。可以根据需要选择其他标准,比如 C++14 或 C++17。 -
set(CMAKE_CXX_STANDARD_REQUIRED True)
: 告诉 CMake 要求指定的 C++ 标准,如果不支持就报错。
进行测试
1.CMakeLists.txt
#CMake 最低版本要求
cmake_minimum_required(VERSION 3.22)
#项目信息
project(HelloSpeak)
#指定生成的目标
add_executable(CmakeHelloSpeak speak.c hellospeak.c)
2.执行cmake [CMakeLists.txt所在文件夹]
生成了一套标准的Makefile文件,
多了cmake_install.cmake, CMakeCache.txt, Makefile
3.再执行make命令
经过链接后生成可执行文件 CmakeHelloSpeak