文章目录
一、什么是CMake?有什么用的?
CMake是一个跨平台的编译(Build)工具, 不同平台之间的编译方式遵循不同的规则,彼此不通用。因此 Cmake被提出,他统一了一套规则, 来描述所有平台的编译过程。
它允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。
cmake 文档:https://cmake.org/cmake/help/latest/guide/tutorial/index.html
二、linux 下的 Cmake 使用
以hello_world为例进行分析
1、 基础运行
(1) CMakeList.txt
# 指定所需 CMake 的最低版本
cmake_minimum_required (VERSION 3.5)
# 项目的名称 hello_world
project (hello_world)
# 将名为 hello.c 的源文件编译成一个名称为 hello_world.exe 的可执行文件
add_executable(hello_world hello.c)
(2) hello.c
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
(3) 编译
创建build文件夹, 在build 文件夹路径下进行编译
mkdir build
cd build
cmake ../test
cmake --build . 或者 make
2、 cmake 编译Debug和release版本
一般Debug和Release必须在不同的目录下编译,否则每次当切换模式时必须把编译文件全部删掉。如果不使用CMAKE_BUILD_TYPE参数,则默认是Debug
# Debug 用于无优化的情况下,使用调试符号 构建可执行程序
mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug ..
make
# Release 用于有优化的情况下,不使用调试符号 构建可执行程序,生成的文件更小
mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release ..
make
其他的编译选项:
RelWithDeInfo: 较少优化, 包含符号
MinSizeRel :用于不增加目标代码大小的优化方式来构建可执行程序
3、 生成静态和动态库
两者 使用的生成命令略有不同,其余都相同
#动态库, 用 test.c 生成 libtest.so的动态库
add_linrary( test SHARED test.c)
#静态库,生成 libtest.a
add_linrary( test STATIC test.c)
# 链接动态/静态库
target_link_libraries(可执行程序 链接库名(test))
具体结构
(1) CMakeList.txt
cmake_minimum_required (VERSION 3.5)
project (hello_world)
// 用 math.c 生成 libmath.a 的静态库
add_linrary(math STATIC math.c)
add_executable(hello_world hello.c)
// # 链接库
target_link_libraries(hello_world math)
(2) hello.c
#include <stdio.h>
#include “math.h”
int main()
{
printf("hello world,1+1=%d\n",add(1,1));
return 0;
}
(3) math.c
int add(int m, int n)
{
return m+n;
}
(4) math.h
#ifndef __MATH_H__
#define __MATH_H__
int add(int);
#endif
// 若没导入 __MATH_H__,则导入,否则不导入
(5) 编译
cmake ../
make
三、Windows下的 Cmake 使用
和 在linux下的使用相同,只是生成的是 .sln, .vcxproj文件。
应用linux下的 1、 基础运行文件,到CMakeLists.txt 文件所在目录,运行 cmake .
,得到 4个文件:
hello_world .sln、 ALL_BUILD.vcxproj、 hello_world .vcxproj、 ZERO_CHECK.vcproj。
然后 执行命令 msbuild hello_world.sln
,
就可以在 build 目录下面找到 hello_world.exe 程序。