CMake了解一下

2018-09-21

CMake了解一下

又来制造垃圾文章了,这次记录一下折腾使用Cmake的过程。

本篇摘自大佬博客,然后自己实践一遍才写的。

CMake是什么

CMake is an open-source, cross-platform family of tools designed to build, test and package software. CMake is used to control the software compilation process using simple platform and compiler independent configuration files, and generate native makefiles and workspaces that can be used in the compiler environment of your choice. The suite of CMake tools were created by Kitware in response to the need for a powerful, cross-platform build environment for open-source projects such as ITK and VTK. — cmake.org

瞎翻译:CMake 是开源、跨平台编译构建、测试、打包软件的工具,生成您所在平台的makefile工作环境,它最初由Kitware创建。为包括ITK和VTK等开源项目的强大跨平台构建环境的需求提供支持。

解决的问题

我们先来看一下各平台的Make工具:

  • Microsoft – MS nmake;
  • GNU – GNU Make;
  • QT – qmake
  • BSD Make – pmake;
  • Makeapp;

这些Make工具有着不同的标准和规范,Makefile格式也都不同,所以想要跨平台的软件可能需要根据不同的平台编写Makefile,这样做产生了很大的问题。那么有没有一种解决方案能一下子解决所有Makefile的编写问题,不用重复工作,CMake正是做这样事情的工具。

CMake

使用流程

创建项目

  1. 编写项目(对就是正常的写项目);
  2. 编写 CMakeList.txt 来制定编译流程;
  3. 测试、发布项目;

CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。 –hahack

编译项目

  1. 执行cmake PATHccmake PATH,生成Makefile;
  2. 正常的通过Makefile执行make编译项目;

(很简单难道不是么?)

开始折腾使用

一个单源文件的编译

main.c

1
2
3
4
5
6
//main.c
#include<stdio.h>
int main(){
printf("hello");
return 0;
}

编译

日常的编译流程

1
$gcc -o main main.c

使用CMake的编译流程

创建 CMakeLists.txt 在项目目录中

1
2
3
cmake_minimum_required (VERSION 2.8)# CMake 最低版本号要求
project (Hello) # 项目信息
add_executable(Hello main.c) # 指定生成目标

执行 cmake .

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 remi@REMI_IOs-MacBook$ ~/mycode/crow/testcmake  cmake .
-- The C compiler identification is AppleClang 9.1.0.9020039
-- The CXX compiler identification is AppleClang 9.1.0.9020039
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/remi/mycode/crow/testcmake

biubiubiu~~~

1
2
CMakeCache.txt      CMakeLists.txt      cmake_install.cmake
CMakeFiles Makefile main.c

目录就变成酱紫了,是的生成了Makefile,再make加热一下可以吃了

多个文件的编译

假若我们在 main.c 中调用了同目录下 func.c 中的函数只需要按照以上修改一下 CMakeLists.txt 即可

1
2
3
cmake_minimum_required (VERSION 2.8)# CMake 最低版本号要求
project (Hello) # 项目信息
add_executable(Hello main.c func.c) # 指定生成目标

当然如果目录中文件变得很多的话可以这样做:(不用一个个的写文件名)

1
2
3
4
cmake_minimum_required (VERSION 2.8)# CMake 最低版本号要求
project (Hello) # 项目信息
aux_source_directory(. PROJECT_PATH)# 查找当前目录下的所有源文件存到 PROJECT_PATH 变量
add_executable(Hello ${PROJECT_PATH})# 指定生成目标

子目录编译

目录结构是酱子:

1
2
3
4
5
6
7
./Hello
|
+--- hello.c
|
+--- func/
|
+--- func.c

CMakeLists.txt :

1
2
3
4
5
6
cmake_minimum_required (VERSION 2.8)
project (Hello)
aux_source_directory(. PROJECT_PATH)
add_subdirectory(math) #这里是子目录
add_executable(Hello hello.c)
target_link_libraries(Hello func)
  • add_subdirectory 是声明包含的子目录

在子目录中func/中的 CMakeLists.txt:

1
2
aux_source_directory(. PROJECT_PATH_FUNC)
add_library (func ${PROJECT_PATH_FUNC})

使用add_library将子目录func中的所有内容编译成静态链接库。

今天就实验到这里,之后再跟进继续~


Comments: