没有合适的资源?快使用搜索试试~ 我知道了~
首页CMAKE手册(中文翻译版).pdf
CMAKE手册(中文翻译版).pdf
5星 · 超过95%的资源 需积分: 48 267 下载量 188 浏览量
更新于2023-03-03
评论 9
收藏 1.59MB PDF 举报
本文是CMake官方文档CMake Tutorial (http://www.cmake.org/cmake/help/cmake_tutorial.html) 的翻译。通过一个样例工程从简单到复杂的完善过程,文档介绍了CMake主要模块(cmake, ctest, cpack)的功能和使用环境
资源详情
资源评论
资源推荐
CMAKE
⼿
册
CMAKE
CMake
⽤
法
导
览
Preface :
本
⽂
是
CMake
官
⽅⽂
档
CMake Tutorial
(http://www.cmake.org/cmake/help/cmake_tutorial.html)
的
翻
译
。
通过
⼀个
样
例
⼯
程
从
简
单
到
复
杂
的
完
善
过
程
,
⽂
档
介
绍
了
CMake
主
要
模
块
(
cmake
,
ctest
,
cpack
)
的
功
能
和
使
⽤环
境
;
从中
可
以
⼀
窥
cmake
的
⼤
体
形
貌
。
正
⽂
如
下:
本
⽂
下
述
内
容
是
⼀个
⼿把⼿
的
使
⽤
指
南
;
它
涵
盖
了
CMake
需
要解
决
的
公共
构
建
系统
的
⼀
些
问题
。
这
些
主
题
中
的
许
多
主
题
已
经
在
`Mastering CMake
⼀
书中以
单
独
的
章
节
被
介
绍
过
,
但
是
通过
⼀个
样
例
⼯
程
看
⼀
看
它
们
如
何
⼯
作也
是
⾮
常
有
帮
助
的
。
本
指
南可
以
在
CMake
源
码
树
的
Tests/Tutorial
路
径
下
找
到
。
每
⼀
步
都
有
它
⾃
⼰
的
⼦
路
径
,
其
中
包
含
该
步
骤
的
⼀个
完
整
的
指
南
。
1.
作为
基
础的
起
始
点
(
步
骤
1
)
最
基
本
的
⼯
程
是
⼀个
从
源
代
码
⽂
件中
构
建
可
执
⾏
⽂
件
的
例
⼦
。
对
于
简
单
⼯
程
,
只
要
⼀个两
⾏
的
CMakeLists
⽂
件
就
⾜
够
了
。
这
将
会作为
我
们
指
南
的
起
点
。
这
份
CMakeLists
⽂
件
看
起
来
像
是
这
样
:
1. cmake_minimum_required (VERSION 2.6)
2. project (Tutorial)
3. add_executable(Tutorial tutorial.cxx)
注
意
到
这
个
例
⼦
在
CMakeLists
⽂
件中使
⽤
了
⼩
写
。
CMake
⽀
持
⼤
写
、
⼩
写
、
混
合
⼤
⼩
写
的
命
令
。
tutorial.cxx
中
的
源
代
码
⽤
来
计
算
⼀个
数
的
平
⽅
根
,
并
且
它
的
第
⼀
版
⾮
常
简
单
,
如
下
所
示
:
1. // A simple program that computes the square root of a number
2. //
计
算
⼀个
数
的
平
⽅
根
的
简
单
程
序
3. #include <stdio.h>
4. #include <stdlib.h>
5. #include <math.h>
6.
7. int main (int argc, char *argv[]) {
8. if (argc < 2) {
9. fprintf(stdout,"Usage: %s number",argv[0]);
10. return 1;
11. }
12. double inputValue = atof(argv[1]);
13. double outputValue = sqrt(inputValue);
14. fprintf(stdout,"The square root of %g is %g", inputValue, outputValue);
15. return 0;
16. }
我
们
添
加
的
第
⼀个
特
性
⽤
来
为
⼯
程
和可
执
⾏
⽂
件
指
定
⼀个
版
本
号
。
虽
然
你
可
以
在
源
代
码
中
唯
⼀
指
定
它
,
但
是
你
在
CMakeLists
⽂
件中
指
定它
可
以
提
供
更
好
的
灵
活
性
。
如
下
所
示
,
我
么
可
以
通过
添
加
⼀个
版
本
号
来
修
改
CMakeLists
⽂
件
:
1. cmake_minimum_required (VERSION 2.6)
2. project (Tutorial)
3. #
版
本
号
4. set (Tutorial_VERSION_MAJOR 1)
5. set (Tutorial_VERSION_MINOR 0)
6. #
配
置
⼀个
头
⽂
件
,
通过
它
向
源
代
码
中传
递
⼀
些
CMake
设
置
。
7. configure_file (
8. "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
9. "${PROJECT_BINARY_DIR}/TutorialConfig.h"
10. )
11. #
将
⼆
进
制
⽂
件
树
添
加到包
含
⽂
件
的
搜
索
路
径
中
,
这
样
我
们
可
以
找
到
TutorialConfig.h
12. include_directories("${PROJECT_BINARY_DIR}")
13. #
添
加
可
执
⾏
⽂
件
14. add_executable(Tutorial tutorial.cxx)
由
于
配
置
过
的
⽂
件
将
会
被
写到
⼆
进
制
⽂
件
⽬
录
下,
我
们
必
须
把
该
⽬
录
添
加到包
含
⽂
件
的
搜
索
路
径
清
单
中
。
然
后
,
以
下
的
代
码
就
可
以
在
源
⽬
录
下
创
建
⼀
份
TotorialConfig.h.in
⽂
件
:
1. //
与
tutorial
相
关
的
配
置
好
的
选
项
与
设
置
;
2. #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
3. #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
当
CMake
配
置
这
份
头
⽂
件
时
,
@Tutorial_VERSION_MAJOR@
和
@Tutorial_VERSION_MINOR@
的
值
将
会
被
从
CMakeLists
⽂
件中传
递过
来
的
值
替
代
。
下⼀
步
,
我
们
要
修
改
tutorial.cxx
来
包
含
con
fi
gured
头
⽂
件
然
后
使
⽤
其
中
的
版
本
号
。
修
改
过
的
源
代
码
展
列
于
下:
1. //
计
算
平
⽅
根
的
简
单
程
序
。
2. #include <stdio.h>
3. #include <stdlib.h>
4. #include <math.h>
5. #include "TutorialConfig.h"
6.
7. int main (int argc, char *argv[]) {
8. if (argc < 2) {
9. fprintf(stdout,"%s Version %d.%d\n",
10. argv[0],
11. Tutorial_VERSION_MAJOR,
12. Tutorial_VERSION_MINOR);
13. fprintf(stdout,"Usage: %s number\n",argv[0]);
14. return 1;
15. }
16. double inputValue = atof(argv[1]);
17. double outputValue = sqrt(inputValue);
18. fprintf(stdout,"The square root of %g is %g\n", inputValue, outputValue);
19. return 0;
20. }
2.
引
⼊
库
(
步
骤
2
)
现
在
我
们
将
会
在
我
们
的
⼯
程
中
引
⼊
⼀个
库
。
这
个
库
会
包
含
我
们
⾃
⼰实
现
的
计
算
⼀个
数
的
平
⽅
根
的
函
数
。
可
执
⾏
⽂
件
随
后可
以使
⽤
这
个
库
⽂
件
⽽
不
是
编
译
器
提
供
的
标
准
开平
⽅
函
数
。
在
本
指
南
中
,
我
们
将
会
把
库
⽂
件
放
到
⼀个
⼦
⽬
录
MathFunctions
中
。
它
包
含
下
述
的
单
⾏
CMakeLists
⽂
件
:
1. add_library(MathFunctions mysqrt.cxx)
源
⽂
件
mysqrt.cxx
有
⼀个
叫
做
mysqrt
的
函
数
,
它
提
供了
与
编
译
器
的
sqrt
函
数
类
似
的
功
能
。
为了使
⽤
新
的
库
,
我
们
在
顶
层
的
CMakeLists
中
增
加
⼀个
add_subdirectory
调
⽤
,
这
样
这
个
库
也会
被
构
建
。
我
们也
要
向可
执
⾏
⽂
件中
增
加
另
⼀个
头
⽂
件
路
径
,
这
样
就
可
以从
MathFunctions/mysqrt.h
头
⽂
件中
找
到函
数
的
原
型
。
最
后
的
⼀
点
更
改
是
在
向可
执
⾏
⽂
件中
引
⼊
新
的
库
。
顶
层
CMakeLists
⽂
件
的
最
后
⼏
⾏
现
在
看
起
来
像
是
这
样
:
1. include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
2. add_subdirectory (MathFunctions)
3. #
引
⼊
可
执
⾏
⽂
件
4. add_executable (Tutorial tutorial.cxx)
5. target_link_libraries (Tutorial MathFunctions)
现
在
,
让
我
们
考
虑
下
让
MathFunctions
库
变
为
可
选
的
。
在
本
指
南
中
,
确
实
没
有
必
要
这
样
画
蛇
添
⾜
;
但
是
对
于
更
⼤
型
的
库
或
者
依
赖
于
第
三
⽅
代
码的
库
,
你
可
能
需
要
这
种
可
选
择
性
。
第
⼀
步
是
为
顶
层
的
CMakeLists
⽂
件
添
加
⼀个
选
项
:
1. #
我
们
应
该
使
⽤
我
们
⾃
⼰
的
数
学
函
数
吗
?
2. option (USE_MYMATH "Use tutorial provided math implementation" ON)
这
将
会
在
CMake
的
GUI
中
显
示
⼀个
默
认
的
ON
值
,
并
且
⽤
户
可
以
随需
改
变
这
个
设
置
。
这
个
设
置
会
被
存
储
在
cache
中
,
那
么
⽤
户
将
不
需
要
在
cmake
该
⼯
程
时
,
每次
都
设
置
这
个
选
项
。
第
⼆
处
改
变
是
,
让
链
接
MathFunctions
库
变
为
可
选
的
。
要
实
现
这
⼀
点
,
我
们修
改
顶
层
CMakeLists
⽂
件
的
结
尾
部
分
:
1. #
添
加
MathFunctions
库
吗
?
2. if (USE_MYMATH)
3. include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
4. add_subdirectory (MathFunctions)
5. set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
6. endif (USE_MYMATH)
7. #
添
加
可
执
⾏
⽂
件
8. add_executable (Tutorial tutorial.cxx)
9. target_link_libraries (Tutorial ${EXTRA_LIBS})
这
⾥
⽤
USE_MYMATH
设
置
来
决
定
是
否
MathFunctions
应
该被
编
译
和
执
⾏
。
注
意
到
,
要
⽤
⼀个
变
量
(
在
这
⾥
是
EXTRA_LIBS
)
来
收
集
所
有
以
后
会
被
连
接
到
可
执
⾏
⽂
件中
的
可
选
的
库
。
这
是
保
持
带
有
许
多
可
选部
件
的
较
⼤
型
⼯
程
⼲
净
清
爽
的
⼀
种
通
⽤
的
⽅
法
。
源
代
码
对
应
的
改
变
相
当
直⽩
,
如
下
所
示
:
1. //
计
算
⼀个
数
平
⽅
根
的
简
单
程
序
2. #include <stdio.h>
3. #include <stdlib.h>
4. #include <math.h>
5. #include "TutorialConfig.h"
6. #ifdef USE_MYMATH
7. #include "MathFunctions.h"
8. #endif
9.
10. int main (int argc, char *argv[]) {
11. if (argc < 2) {
12. fprintf(stdout,"%s Version %d.%d\n", argv[0],
13. Tutorial_VERSION_MAJOR,
14. Tutorial_VERSION_MINOR);
15. fprintf(stdout,"Usage: %s number\n",argv[0]);
16. return 1;
17. }
18.
19. double inputValue = atof(argv[1]);
20.
21. #ifdef USE_MYMATH
22. double outputValue = mysqrt(inputValue);
23. #else
24. double outputValue = sqrt(inputValue);
25. #endif
26.
27. fprintf(stdout,"The square root of %g is %g\n", inputValue, outputValue);
28. return 0;
29. }
在
源
代
码
中
,
我
们也使
⽤
了
USE_MYMATH
。
这
个
宏
是
由
CMake
通过
TutorialCon
fi
g.h.in
配
置
⽂
件中
的
下
述
语
句
⾏
提
供
给
源
代
码的
:
1. #cmakedefine USE_MYMATH
3.
安
装
与
测
试
(
步
骤
3
)
下⼀
步
我
们会为
我
们
的
⼯
程
引
⼊
安
装规
则
以
及
测
试
⽀
持
。
安
装规
则
相
当
直⽩
,
对
于
MathFunctions
库
,
我
们
通过
向
MathFunctions
的
CMakeLists
⽂
件
添
加
如
下两
条
语
句
来
设
置
要
安
装
的
库
以
及
头
⽂
件
:
1. install (TARGETS MathFunctions DESTINATION bin)
2. install (FILES MathFunctions.h DESTINATION include)
对
于
应
⽤
程
序
,
在
顶
层
CMakeLists
⽂
件中
添
加
下
⾯
⼏
⾏
,
它
们
⽤
来
安
装
可
执
⾏
⽂
件以
及
配
置
头
⽂
件
:
1. #
添
加
安
装
⽬
标
2. install (TARGETS Tutorial DESTINATION bin)
3. install (FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h" DESTINATION include)
这
就
是
要
做
的
全
部
;
现
在
你
应
该
可
以
构
建
tutorial
⼯
程
了
。
然
后
,
敲
⼊
命
令
make install
(
或
者
从
IDE
中
构
建
INSTALL
⽬
标
)
然
后
它就
会
安
装
需
要
的
头
⽂
件
,
库
以
及可
执
⾏
⽂
件
CMake
的
变
量
CMAKE_INSTALL_PREFIX
⽤
来
确
定
这
些
⽂
件
被
安
装
的
根
⽬
录
。
添
加
测
试
同
样
也
只
需
要
相
当
浅
显
的
过
程
。
在
顶
层
CMakeLists
⽂
件
的的
尾
部
补
充
许
多基
本
的
测
试
代
码
来
确
认
应
⽤
程
序
可
以
正
确
⼯
作
。
1. #
应
⽤
程
序
是
否
运
⾏
?
2. add_test (TutorialRuns Tutorial 25)
3.
4. #
它
是
否
对
25
做
了
开平
⽅
运
算
5. add_test (TutorialComp25 Tutorial 25)
6.
7. set_tests_properties (TutorialComp25
8. PROPERTIES PASS_REGULAR_EXPRESSION "25 is 5")
9.
10. #
它
是
否
能
处
理
是
负
数
作为
输
⼊
的
情
况
11. add_test (TutorialNegative Tutorial -25)
12. set_tests_properties (TutorialNegative
13. PROPERTIES PASS_REGULAR_EXPRESSION "-25 is 0")
14.
15. #
它
是
否可
以
处
理
较
⼩
的
数
字
。
16. add_test (TutorialSmall Tutorial 0.0001)
17. set_tests_properties (TutorialSmall
18. PROPERTIES PASS_REGULAR_EXPRESSION "0.0001 is 0.01")
19.
20. #
⽤
法
信
息
是
否可
⽤
?
21. add_test (TutorialUsage Tutorial)
22. set_tests_properties (TutorialUsage
23. PROPERTIES
24. PASS_REGULAR_EXPRESSION "Usage:.*number")
第
⼀个
测
试
⽤
例仅仅
⽤
来
验
证
程
序
可
以
运
⾏
,
没
有
出
现
段
错
误
或
其
他
的
崩
溃
,
并
且
返
回
值
必
须
是
0
。
这
是
CTest
所
做
测
试
的
基
本格
式
。
余
下
的
⼏
个
测
试
都
是
⽤
PASS_REGULAR_EXPRESSION
测
试
属
性
来
验
证
测
试
代
码的
输
出
是
否
包
含
有
特
定
的
字
符
串
。
在
本
例中
,
测
试
样
例
⽤
来
验
证计
算
得
出
的
平
⽅
根
与
预
定
值
⼀
样
;
当
指
定
错
误
的
输
⼊
数据
时
,
要
打
印
⽤
法
信
息
。
如
果
你
想
要
添
加
许
多
测
试
不
同
输
⼊
值
的
样
例
,
你
应
该
考
虑
创
建
如
下
所
示
的
宏
:
1. #
定
义
⼀个
宏
来
简
化
添
加
测
试
的
过
程
,
然
后
使
⽤
它
2. macro (do_test arg result)
3. add_test (TutorialComp${arg} Tutorial ${arg})
4. set_tests_properties (TutorialComp${arg}
5. PROPERTIES PASS_REGULAR_EXPRESSION ${result})
6. endmacro (do_test)
7. #
做
⼀
系
列
基
于
结
果
的
测
试
8. do_test (25 "25 is 5")
9. do_test (-25 "-25 is 0")
对
于
每
个
do_test
宏
调
⽤
,
都
会
向
⼯
程
中
添
加
⼀个
新
的
测
试
⽤
例
;
宏
参
数
是
测
试
名
、
函
数
的
输
⼊
以
及
期望
结
果
。
4.
增
加
系统
内
省
(
步
骤
4
)
下⼀
步
,
让
我
们
考
虑
向
我
们
的
⼯
程
中
引
⼊
⼀
些依
赖
于
⽬
标
平
台
上
可
能
不
具
备
的
特
性
的
代
码
。
在
本
例
中
,
我
们会
增
加
⼀
些依
赖
于
⽬
标
平
台
是
否
有
log
或
exp
函
数
的
代
码
。
当
然
,
⼏
乎
每
个
平
台
都
有
这
些
函
数
;
但
是
对
于
tutorial
⼯
程
,
我
们
假
设
它
们
并
⾮
如
此
普
遍
。
如
果
该
平
台
有
log
函
数
,
那
么
我
们会
在
mysqrt
函
数
中使
⽤
它
去
计
算
平
⽅
根
。
我
们
⾸
先
在
顶
层
CMakeLists
⽂
件中使
⽤
宏
CheckFunctionExists.cmake
测
试
这
些
函
数
的
可
⽤
性
:
1. #
该
系统
提
供
log
和
exp
函
数
吗
?
2. include (CheckFunctionExists.cmake)
3. check_function_exists (log HAVE_LOG)
4. check_function_exists (exp HAVE_EXP)
下⼀
步
,
如
果
CMake
在
对
应平
台
上
找
到
了
它
们
,
我
们修
改
TutorialCon
fi
g.h.in
来
定
义
这
些
值
;
如
下:
1. //
该
平
台
提
供
exp
和
log
函
数
吗
?
2. #cmakedefine HAVE_LOG
3. #cmakedefine HAVE_EXP
这
些
log
和
exp
函
数
的
测
试要
在
TutorialCon
fi
g.h
的
con
fi
gure_
fi
le
命
令之
前
被
处
理
,
这
⼀
点
很
重
要
。
最
后
,
在
mysqrt
函
数
中
,
如
果
log
和
exp
在
当
前
系统
上
可
⽤
的
话
,
我
们
可
以
提
供
⼀个
基
于
它
们
的
可
选
的
实
现
:
1. //
如
果
我
们
有
log
和
exp
两个
函
数
,
那
么使
⽤
它
们
2. #if defined (HAVE_LOG) && defined (HAVE_EXP)
3. result = exp(log(x)*0.5);
4. #else //
否
则
使
⽤
替
代
⽅
法
5.
添
加
⼀个
⽣
成
⽂
件以
及
⽣
成
器
(
步
骤
5
)
在
本
节
,
我
们会
展
示
你
应
该
怎
样
向
⼀个
应
⽤
程
序
的
构
建
过
程
中
添
加
⼀个
⽣
成
的
源
⽂
件
。
在
本
范
例中
,
我
们会
创
建
⼀个
预
先
计
算
出
的
平
⽅
根
表
作为
构
建
过
程
的
⼀
部
分
。
MathFunctions
⼦
路
径
下,⼀个
新
的
MakeTable.cxx
源
⽂
件
来
做
这
件事
。
1. //
⼀个
简
单
的
⽤
于
构
建平
⽅
根
表
的
程
序
2. #include <stdio.h>
3. #include <stdlib.h>
4. #include <math.h>
5.
6. int main (int argc, char *argv[]) {
7. int i;
8. double result;
剩余63页未读,继续阅读
白菜888
- 粉丝: 7
- 资源: 75
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- ExcelVBA中的Range和Cells用法说明.pdf
- 基于单片机的电梯控制模型设计.doc
- 主成分分析和因子分析.pptx
- 共享笔记服务系统论文.doc
- 基于数据治理体系的数据中台实践分享.pptx
- 变压器的铭牌和额定值.pptx
- 计算机网络课程设计报告--用winsock设计Ping应用程序.doc
- 高电压技术课件:第03章 液体和固体介质的电气特性.pdf
- Oracle商务智能精华介绍.pptx
- 基于单片机的输液滴速控制系统设计文档.doc
- dw考试题 5套.pdf
- 学生档案管理系统详细设计说明书.doc
- 操作系统PPT课件.pptx
- 智慧路边停车管理系统方案.pptx
- 【企业内控系列】企业内部控制之人力资源管理控制(17页).doc
- 温度传感器分类与特点.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1