网上已经有很多的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 实践 小结的更多相关文章

  1. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  2. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  3. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件

    <CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...

  4. 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX【转】

    本文转载自:http://www.cnblogs.com/52php/p/5681751.html 四.更好一点的Hello World 没有最好,只有更好 从本小节开始,后面所有的构建我们都将采用  ...

  5. 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE【转】

    本文转载自:http://www.cnblogs.com/52php/p/5681745.html 前言: 开发了5,6年的时间,如果没有KDE4,也许不会有人或者Linux发行版本重视cmake,因 ...

  6. 《CMake实践》第三部分的示例代码的错误

    <CMake实践>的第三章,初试cmake - cmake的helloworld 中的 PROJECT (HELLO) SET(SRC_LIST main.c) MESSAGE(statu ...

  7. CMake实践--操作

    ---<Cmake 实践>--- ---Ubuntu 14.04 1.创建一个cmake文件目录 mkdir -p ~/cmake 2.在cmake文件下创建t1子目录 cd ~/cmak ...

  8. Cmake的介绍和使用 Cmake实践【转】

    本文转载自:http://www.cppblog.com/Roger/archive/2011/11/17/160368.html Cmake的介绍和使用 Cmake实践 Cmake优点: 1.    ...

  9. Cmake的介绍和使用 Cmake实践

    Cmake的介绍和使用 Cmake实践http://www.cppblog.com/Roger/archive/2011/11/17/160368.html

  10. CMake实践(4)

    一,本期目标: [sun@localhost t4]$ cat README 任务:如何使用外部共享库和文件 二,目录结构 [sun@localhost t4]$ tree ../t4../t4├── ...

随机推荐

  1. Avalonia跨平台实战(二),Avalonia相比WPF的便利合集(一)

    本话讲的是Avalonia中相比于WPF更方便的一些特性 布局 布局方面没什么好说的,和WPF没什么区别,Grid,StckPanel...这些,不熟悉的话可以B站上找一下教程 xml树 在WPF中我 ...

  2. 🎀抓包工具安装-Charles

    简介 Charles 作为一个 HTTP 代理/HTTP 监视器/反向代理工具,允许开发者查看他们的计算机与互联网之间的所有 HTTP 和 HTTPS 通信.工作原理是基于 HTTP 代理的概念,它充 ...

  3. 查询相册更加mysql 查询

    接到一个项目项目案例相册是这种结构 大佬建议 sql 查询 groip 进行时间统计今天 field根据mysql 时间查询进行统计 今天多少条 新增多少条相册 计算天数 $lists = Album ...

  4. 【漏洞扫描】Nuclei v3.4.1 下载方法(附快速下载链接)

    简介 Nuclei v3.4.1是一款强大的漏洞扫描器,并且拥有社区维护的海量漏洞POC,工具质量十分的高.Nuclei 用于基于模板跨目标发送请求,从而实现零误报并提供对大量主机的快速扫描.Nucl ...

  5. 将 Excel 拼接为 SQL 脚本

    好像半年前,我就有写过将 Excel 数据, 逐条 或 批量 插入 mysql 数据库, 那时候正在建库嘛, 想着弄个脚本来批量刷新和处理. 工具当时用的 pandas, 这个, 强的一批的工具, 无 ...

  6. FastAPI与Alembic:数据库迁移的隐秘艺术

    title: FastAPI与Alembic:数据库迁移的隐秘艺术 date: 2025/05/13 02:02:31 updated: 2025/05/13 02:02:31 author: cmd ...

  7. Pycomcad实现Autocad橡皮线效果

    import sys sys.path.append(r'F:\PycharmProject\PycomCAD') from pycomcad import * def tryit(): acad.I ...

  8. JS+CSS多行文本显示“更多”

    本代码展示最多显示3行,每行行高16px,3行总高48px,4行总高64px 当文本行数1-3行,正常显示:当文本行数大于3行,显示"更多". CSS: #CourseDesc { ...

  9. File与IO流之File基础

    File构造方法: public File(String pathname){} //将字符串路径变成File对象 public File(String parent , String chlid){ ...

  10. 代码随想录第11天 | 二叉树part01

      理论基础 需要了解 二叉树的种类,存储方式,遍历方式 以及二叉树的定义 文章讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7 ...