CMake 实践 小结
网上已经有很多的CMake的总结也好博客也好。
全当个人的记录。如果有错误务必留言。
what is CMake?
一般来说就是一个自动生成makefile的工具。--脚本语言。
why learn it?
大型项目比较方便,也仅此而已。
How to learn it?
常用的语言变量:
<projectname>_BINARY_DIR == PROJECT_BINARY_DIR 工程编译路径 /backup/cmake/t1/build
<projectname>_SOURCE_DIR == PROJECT_SOURCE_DIR 工程路径 /backup/cmake/t1
EXECUTABLE_OUTPUT_PATH 二进制文件的输出目录
LIBRARY_OUTPUT_PATH 共享库目录
CMAKE_INSTALL_PREFIX install 安装目录的前缀
×.so 动态库
×.a 静态库
环境变量 CMAKE_INCLUDE_PATH 头文件的环境变量 命令INCLUDE_DIRECTORIES(${myHeader}) 替换方式之一
掌握常用的语言规则:
make VERBOSE=1
显示详细的编译过程
PROJECT(projectname [CXX] [C] [Java])
一般就是简单协议下工程的名字。因为默认支持所有语言。
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
显示定义变量
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
向终端输出信息
ADD_EXECUTABLE(hello ${SRC_LIST})
生成一个hello 的可执行文件
在哪里执行以上命令,就在哪里执行更改文件输出的指令
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
ADD_LIBRARY(libname
[SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)
常用指令例子
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
执行生成库的命令
cmake ..
在执行build上一层的CMakeList.txt
make
执行make
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。
一般形式 ADD_SUBDIRECTORY(src bin)
INSTALL(TARGETS targets...
[[ARCHIVE|LIBRARY|RUNTIME]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONFIGURATIONS
[Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL]
] [...])
用于各个目录的安装 TARGETS== 目标二进制、动态库、静态库以及文件、目录、脚本等。
SET_TARGET_PROPERTIES(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
设置目标的性质 比如名称
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
定义头文件的搜索目录(不在标准的库文件目录里面)
例子 : INCLUDE_DIRECTORIES(/usr/include/hello)
TARGET_LINK_LIBRARIES(target library1
<debug | optimized> library2
...)
添加需要链接的共享库
TARGET_LINK_LIBRARIES(main libhello.a)
FIND_PACKAGE(<name> [major.minor] [QUIET] [NO_MODULE]
[[REQUIRED|COMPONENTS] [componets...]])
查找文件包依赖似乎
通过 SET(CMAKE_MODULE_PATH dir)将自己做的cmake 模块放入工程的某个目录
中供工程使用 这样就能找到FIND_PACKAGE包了似乎
指令是大小写无关的,参数和变量是大小写相关的。
一般选择外部构建,这样对源文件的改变最小。
需要为任何子目录建立一个 CMakeLists.txt。
前面我们已经提到了,使用${}进行变量的引用。在 IF 等语句中,是直接使用变量名而不通过${}取值。
简易例子:
INSTALL(TARGETS myrun mylib mystaticlib
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION libstatic
)
可执行二进制 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录
动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录
静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录
INSTALL(DIRECTORY icons scripts/ DESTINATION share/myprojPATTERN "CVS" EXCLUDE
PATTERN "scripts/*"
PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ
GROUP_EXECUTE GROUP_READ)
将 icons 目录安装到 <prefix>/share/myproj,将 scripts/中的内容安装到<prefix>/share/myproj
不包含目录名为 CVS 的目录,对于 scripts/* 文件指定权限为 OWNER_EXECUTE
OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ.
更改prefix的执行方式:
cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr ..
命令 中间变量 执行上级的CMakeLists.txt
然后运行
make
make install
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")
更改hello_static 的性质 名称 为 hello +++++
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1)
加上这两条命令可以生成 libhello.so 和 libhello.a 同名静态库和动态库
文件的一般结构:
--PROJ 工程目录
--build 编译目录
--doc 工程文档,相关资料
--src 源代码目录
--bin 二进制代码
--cmake cmake 模块位置
CMake 实践 小结的更多相关文章
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX【转】
本文转载自:http://www.cnblogs.com/52php/p/5681751.html 四.更好一点的Hello World 没有最好,只有更好 从本小节开始,后面所有的构建我们都将采用 ...
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE【转】
本文转载自:http://www.cnblogs.com/52php/p/5681745.html 前言: 开发了5,6年的时间,如果没有KDE4,也许不会有人或者Linux发行版本重视cmake,因 ...
- 《CMake实践》第三部分的示例代码的错误
<CMake实践>的第三章,初试cmake - cmake的helloworld 中的 PROJECT (HELLO) SET(SRC_LIST main.c) MESSAGE(statu ...
- CMake实践--操作
---<Cmake 实践>--- ---Ubuntu 14.04 1.创建一个cmake文件目录 mkdir -p ~/cmake 2.在cmake文件下创建t1子目录 cd ~/cmak ...
- Cmake的介绍和使用 Cmake实践【转】
本文转载自:http://www.cppblog.com/Roger/archive/2011/11/17/160368.html Cmake的介绍和使用 Cmake实践 Cmake优点: 1. ...
- Cmake的介绍和使用 Cmake实践
Cmake的介绍和使用 Cmake实践http://www.cppblog.com/Roger/archive/2011/11/17/160368.html
- CMake实践(4)
一,本期目标: [sun@localhost t4]$ cat README 任务:如何使用外部共享库和文件 二,目录结构 [sun@localhost t4]$ tree ../t4../t4├── ...
随机推荐
- sql查询语句典例整理
简单查询: 1.SELECT * FROM 表名称 WHERE 字段名 LIKE '查询内容' 1). SELECT * FROM member WHERE NickName LIKE '贝克汉姆': ...
- 机器人操作系统ROS2之简介
什么是ROS2? ROS(机器人操作系统)是用于机器人应用的开源软件开发工具包.ROS 为各行业的开发者提供了一个标准的软件平台,帮助他们从研究和原型设计一直推进到部署和生产,从驱动程序到最先进的算法 ...
- CTF实验吧认真一点 SQL盲注
实验吧地址 http://ctf5.shiyanbar.com/web/earnest/index.php 很明显的返回两个不同得页面,判断为SQL盲注 并且 过滤了敏感字符 测试的时候还发现过滤了s ...
- 《HelloGitHub》第 109 期
兴趣是最好的老师,HelloGitHub 让你对开源感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. github.com/521xueweihan/HelloG ...
- 2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了!
2K star!三分钟搭建企业级后台系统,这款开源Java框架绝了! "LikeAdmin Java是基于Spring Boot + Mybatis Plus + Vue 3的快速开发平台, ...
- 【记录】日常|shandianchengzi的三周年创作纪念日
机缘 接触 CSDN 之前,我已经倒腾过 hexo 搭建 github 博客.本地博客.图床: 接触 CSDN 之后,我还倒腾过纸质笔记.gitee 博客.博客园.知乎.b站.Notion.腾 ...
- 操作系统综合题之“采用记录型信号量机制实现进程INPUT、PROCESS和OUTPUT的同步算法(代码补充)”
1.问题:系统中有有三个进程INPUT.PROCESS和OUTPUT,共用两个缓冲区BUF1和BUF2.假期设BUF1中最多可放10个数据,现已放入了2个数据:BUF2最多可放5个数据.INPUT进程 ...
- 为什么我们痴迷于令人兴奋的 ChatGPT AI 聊天机器人
.markdown-body { color: rgba(89, 89, 89, 1); font-size: 15px; font-family: -apple-system, system-ui, ...
- 高性能NoSQL
极客时间:<从 0 开始学架构>:高性能NoSQL 1.引言 关系型数据库凭借着SQL功能和ACID的属性,活跃于各种各样的系统中,但它并不是完美的,其存在以下缺点: 关系数据库存储的是行 ...
- Django踩坑之ExtendsNode: extends 'base/base.html'> must be the first tag in the template.
模板继承报错: extends 'base/base.html'> must be the first tag in the template base.html如下: <!-- {% l ...