CMake入门

CMake是一个跨平台的安装编译工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake

一、单个文件

main.cc

#include <stdio.h>
#include <stdlib.h> double power(double base, int exponent)
{
int result = base;
int i; if (exponent == 0)
{
return 1;
} for (i = 1; i < exponent; ++i)
{
result = result * base;
}
return result;
} int main(int argc, char *argv[])
{
if (argc < 3)
{
printf("Usage: %s base exponent \n", argv[0]);
return 1;
}
double base = atof(argv[1]);
int exponent = atoi(argv[2]);
double result = power(base, exponent);
printf("%g ^ %d is %g\n", base, exponent, result);
return 0;
}

当前目录下的CMakeLists.txt(CMakeLists 不区分大小写)

# 版本最低要求
cmake_minimum_required(VERSION 2.8)
# 项目信息
project(Demo01)
# 指定生成目标
add_executable(Demo01 main.cc)

执行命令

cmake . # 执行cmake,自动生成对应的makefile
make # 生成二进制文件Demo01

编译输出

➜  cmakedemo cmake .
-- The C compiler identification is AppleClang 9.0.0.9000039
-- The CXX compiler identification is AppleClang 9.0.0.9000039
-- 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/fanghao/Desktop/cmakedemo
➜ cmakedemo make
Scanning dependencies of target Demo01
[ 50%] Building CXX object CMakeFiles/Demo01.dir/main.cc.o
[100%] Linking CXX executable Demo01
[100%] Built target Demo01
➜ cmakedemo ./Demo01 5 4
5 ^ 4 is 625

二、多个文件

修改项目结构如下:

➜  cmakedemo tree
.
├── CMakeLists.txt
├── MathFunction.cc
├── MathFunctions.h
└── main.cc 0 directories, 4 files

CMakeLists.txt也应当添加多个文件

# 版本最低要求
cmake_minimum_required(VERSION 2.8)
# 命令不区分大小写
# 项目信息
project(Demo02) #把源文件变成变量
aux_source_directory(. DIR_SRCS) # 指定生成目标
add_executable(Demo02 ${DIR_SRCS})

三、子模块

修改项目结构如下:

➜  cmakedemo tree
.
├── CMakeLists.txt
├── main.cc
└── math
├── CMakeLists.txt
├── MathFunction.cc
└── MathFunctions.h 1 directory, 5 files

cmakedemo目录下的CMakeLists.txt

# 版本最低要求
cmake_minimum_required(VERSION 2.8)
# 命令不区分大小写
# 项目信息
set(NAME Demo03)
project(${NAME}) # 添加math子目录,会执行math目录下的cmake
add_subdirectory(math) # 指定生成目标
add_executable(${NAME} main.cc) # 添加链接库
target_link_libraries(${NAME} MathFunctions)

math目录下的CMakeLists.txt

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library (MathFunctions ${DIR_LIB_SRCS})

此时的输出,注意编译了子模块

➜  cmakedemo cmake .
-- The C compiler identification is AppleClang 9.0.0.9000039
-- The CXX compiler identification is AppleClang 9.0.0.9000039
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchai
ns/XcodeDefault.xctoolchain/usr/bin/cc-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchai
ns/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/Toolch
ains/XcodeDefault.xctoolchain/usr/bin/c++-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolch
ains/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/fanghao/Desktop/cmakedemo
➜ cmakedemo make
Scanning dependencies of target MathFunctions
[ 25%] Building CXX object math/CMakeFiles/MathFunctions.dir/MathFunction.cc.o
[ 50%] Linking CXX static library libMathFunctions.a
[ 50%] Built target MathFunctions
Scanning dependencies of target Demo03
[ 75%] Building CXX object CMakeFiles/Demo03.dir/main.cc.o
[100%] Linking CXX executable Demo03
[100%] Built target Demo03
➜ cmakedemo ./Demo03 3 4
3 ^ 4 is 81

生成的文件

➜  cmakedemo tree -L 2
.
├── CMakeCache.txt
├── CMakeFiles
│ ├── 3.11.3
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── CMakeTmp
│ ├── Demo03.dir
│ ├── Makefile.cmake
│ ├── Makefile2
│ ├── TargetDirectories.txt
│ ├── cmake.check_cache
│ ├── feature_tests.bin
│ ├── feature_tests.c
│ ├── feature_tests.cxx
│ └── progress.marks
├── CMakeLists.txt
├── Demo03
├── Makefile
├── cmake_install.cmake
├── main.cc
└── math
├── CMakeFiles
├── CMakeLists.txt
├── Makefile
├── MathFunction.cc
├── MathFunctions.h
├── cmake_install.cmake
└── libMathFunctions.a 6 directories, 22 files

可以注意到生成了libMathFunctions.a

三、第三方库

glewglfw为例

cmake_minimum_required(VERSION 3.9)
project(helloworld) set(CMAKE_CXX_STANDARD 11) # 自动寻找库
find_library(OPENGL opengl) # 添加头文件
set(GLEW_H /usr/local/Cellar/glew/2.1.0/include/GL)
set(GLFW_H /usr/local/Cellar/glfw/3.2.1/include/GLFW)
include_directories(${GLEW_H} ${GLFW_H}) # 添加目标链接
set(GLEW_LINK /usr/local/Cellar/glew/2.1.0/lib/libGLEW.2.1.dylib)
set(GLFW_LINK /usr/local/Cellar/glfw/3.2.1/lib/libglfw.3.dylib)
link_libraries(${OPENGL} ${GLEW_LINK} ${GLFW_LINK}) # 执行编译命令
set(SOURCE_FILES main.cc)
add_executable(helloworld ${SOURCE_FILES})

四、小结

cmake作为跨平台的项目管理工具,相比make更加简洁易用。

CMake入门的更多相关文章

  1. CMake 入门实战 | HaHack

    CMake 入门实战 | HaHack undefined

  2. CMake入门(二)

    CMake入门(二) 最后更新日期:2014-04-25 by kagula 阅读前提:<CMake入门(一)>.Linux的基本操作 环境: Windows 8.1 64bit英文版.V ...

  3. CMake入门教程(转帖)

    本文转自:https://www.cnblogs.com/never--more/p/6921837.html CMake入门教程 参考文献:http://www.ibm.com/developerw ...

  4. CMake入门-04-自定义编译选项

    工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! - 自定义编译选项 CMake 允许为项目增加编译选项,从而可以 ...

  5. CMake入门-03-还是HelloWorld

    工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! 扩展-math 目录里的文件编译成静态库再由 main 函数调用 ...

  6. C++ CMake 入门实战[转载]

    C++ CMake 入门实战 2016-11-05 CMake用于跨平台的编译系统,对于通常的c/c++工程,都是通过make来进行编译的,CMake可以通过指令生成Makefile文件来指导整个项目 ...

  7. VScode 使用 CMake 入门

    参考 CMake 入门实战 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下: 编写 CMake 配置文件 CMakeLists.txt . 执行命令 cmake PA ...

  8. CMake 入门实战【转】

    本文转载自:http://www.hahack.com/codes/cmake/ 什么是 CMake All problems in computer science can be solved by ...

  9. CMake入门以及学习笔记

    使用cef3替代chromium内核开发产品过程中,第一次接触到系统构建,使用了最常见的CMake.CMake虽然在构建系统中用的比较多,但是使用到的程序员还是很少的.现在在国内能找到的相关资料和博客 ...

随机推荐

  1. Servlet 学习

    3.1 概念 运行在服务器端的小程序 Servlet 就是一个接口 定义JAVA类被浏览器访问(Tomact 识别)的规则 将来 我们需要自定义一个类 实现servlet 接口 重写方法 3.2 快速 ...

  2. 2018-2019-2 20175209 实验一《Java开发环境的熟悉》实验报告

    2018-2019-2 20175209 实验一<Java开发环境的熟悉>实验报告 一.实验内容及步骤 1.使用JDK编译.运行简单的Java程序 cd 20175209进入2017520 ...

  3. 金融量化分析【day113】:多因子选股

    一.什么是多因子选股 在股市中征战过的朋友们应该知道,股市之道无非三点.1择时,2选股,3 仓控.精通这三点中的任何一点,都足以在股市中所向披靡.但是精通二字何其艰难!!!矫情的话多不多说,咱们进入正 ...

  4. EF CodeFirst系列(2)---CodeFirst的数据库初始化

    1. CodeFirst的默认约定 1.领域类和数据库架构的映射约定 在介绍数据库的初始化之前我们需要先了解领域类和数据库之间映射的一些约定.在CodeFirst模式中,约定指的是根据领域类(如Stu ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 A Hard to prepare(递推)

    https://nanti.jisuanke.com/t/31453 题目 有n个格子拉成一个环,给你k,你能使用任意个数的0 ~ 2^k - 1,规定操作 i XNOR j 为~(i  ^  j), ...

  6. CSS Grid基于网格的二维布局系统(详细教程)

    .grid-wrap{ display: inline-flex; padding: 20px; background: #f4f4f4; word-break: initial; } .handle ...

  7. 深入浅出mybatis之useGeneratedKeys参数用法

    目录 在settings元素中设置useGeneratedKeys参数 在xml映射器中配置useGeneratedKeys参数 在接口映射器中设置useGeneratedKeys参数 在MyBati ...

  8. Spring Security 之基本概念

    Spring Security 是一个安全框架, 可以简单地认为 Spring Security 是放在用户和 Spring 应用之间的一个安全屏障, 每一个 web 请求都先要经过 Spring S ...

  9. Regularity criteria for NSE 6: $u_3,\p_3u_1,\p_3u_2$

    In [Zujin Zhang, Jinlu Li, Zheng-an Yao, A remark on the global regularity criterion for the 3D Navi ...

  10. SSH框架之hibernate《四》

    hibernate第四天     一.JPA相关概念         1.1JPA概述             全称是:Java Persistence API.是sun公司推出的一套基于ORM的规范 ...