CMake入门
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库
三、第三方库
以glew和glfw为例
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入门的更多相关文章
- CMake 入门实战 | HaHack
CMake 入门实战 | HaHack undefined
- CMake入门(二)
CMake入门(二) 最后更新日期:2014-04-25 by kagula 阅读前提:<CMake入门(一)>.Linux的基本操作 环境: Windows 8.1 64bit英文版.V ...
- CMake入门教程(转帖)
本文转自:https://www.cnblogs.com/never--more/p/6921837.html CMake入门教程 参考文献:http://www.ibm.com/developerw ...
- CMake入门-04-自定义编译选项
工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! - 自定义编译选项 CMake 允许为项目增加编译选项,从而可以 ...
- CMake入门-03-还是HelloWorld
工作环境 系统:macOS Mojave 10.14.6 CMake: Version 3.15.0-rc4 Hello,World! 扩展-math 目录里的文件编译成静态库再由 main 函数调用 ...
- C++ CMake 入门实战[转载]
C++ CMake 入门实战 2016-11-05 CMake用于跨平台的编译系统,对于通常的c/c++工程,都是通过make来进行编译的,CMake可以通过指令生成Makefile文件来指导整个项目 ...
- VScode 使用 CMake 入门
参考 CMake 入门实战 在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下: 编写 CMake 配置文件 CMakeLists.txt . 执行命令 cmake PA ...
- CMake 入门实战【转】
本文转载自:http://www.hahack.com/codes/cmake/ 什么是 CMake All problems in computer science can be solved by ...
- CMake入门以及学习笔记
使用cef3替代chromium内核开发产品过程中,第一次接触到系统构建,使用了最常见的CMake.CMake虽然在构建系统中用的比较多,但是使用到的程序员还是很少的.现在在国内能找到的相关资料和博客 ...
随机推荐
- 关于QQ农场牧场等曾经流行的游戏的一些见解
大概在上上周,我偶然间打开QQ空间玩了一会QQ农牧场,玩完之后我在想,在那个年代他们为什么那么红? 我觉得可能有以下几点: 1:凭借着QQ海量的用户,可以迅速推广 2:迎合了人们爱占小便宜的心理,不过 ...
- kubernetes云平台管理实战:deployment通过标签管理pod(十)
一.kubectl run命令拓展 1.RC创建 [root@k8s-master ~]# kubectl run web --generator=run/v1 --image=10.0.128.0: ...
- CentOS7.2 设置静态ip
先找到配置文件: [root@localhost bin]# cd /etc/sysconfig/network-scripts [root@localhost network-scripts]# l ...
- Spring的事务机制
---恢复内容开始--- 内定的=>(只需要在xml 中添加一个bean) 在xml 中添加 <bean id="listener" class="com.t ...
- [再寄小读者之数学篇](2014-05-28 Ladyzhenskaya 不等式)
$$\bex f\in C_c^\infty(\bbR^2)\ra \sen{f}_{L^4}\leq \sqrt{2} \sen{f}_{L^2}^{1/2} \sen{\p_1f}_{L^2}^{ ...
- Mocha
Mocha https://mochajs.org/#installation Mocha is a feature-rich JavaScript test framework running on ...
- SSRF漏洞挖掘经验
SSRF概述 SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞.一般情况下,SSRF攻击的目标是从外网无法访问 ...
- 学习python笔记 协程
下面将一个经典的消费者和生产者的案例进行分析: import time def consumer(): r = '' while True: n = yield r if not n: return ...
- luogu 2154 离散化+杨辉三角+树状数组
将纵向固定,每次在横向找两个点,计算其中间墓地的贡献答案,离散化后同一行的预处理个数, 树状数组内存储C[up[i]][k] * C[down[i][k] 的值,每次更新时 down[横坐标]++; ...
- HEAD FILE
心血来潮做的沙雕Head,喜欢就拿去用吧,Explosion! HEAD //#pragma comment(linker, "/STACK:1024000000,1024000000&qu ...