cmake --version 3.10 doc

1,Cmake introduce

CMake是一种跨平台编译工具,用来生成makefile。CMake主要是编写CMakeLists.txt文件,然后用cmake命令执行CMakeLists.txt文件生成make所需要的makefile文件,最后用make命令编译源码生成可执行程序或库文件。

cmake 指向CMakeLists.txt所在的目录,例如cmake .. 表示CMakeLists.txt在当前目录的上一级目录。cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译,例如

mkdir ckbuild
cd ckbuild
cmake ..
make

1.1 常用的目录结构

.
├── build
├── CMakeLists.txt
├── include
│ └── xxx.h
└── src
├── xxx.c
└── main.c

2,CMakeLists.txt文件的写法

编写CMakeLists.txt文件,该文件一般放在和src,include的同级目录

#1.cmake verson,指定cmake版本
cmake_minimum_required(VERSION 3.5) #2.project name,指定项目的名称,一般和项目的文件夹名称对应
PROJECT(findstr) #3.head file path,头文件目录
INCLUDE_DIRECTORIES(
include
) #4.source directory,源文件目录
AUX_SOURCE_DIRECTORY(src DIR_SRCS) #5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
SET(TEST_MATH
${DIR_SRCS}
) #6.add executable file,添加要编译的可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH}) #7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
#TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)

Cmake 常用命令

Scripting Commands

set

设置常规变量

set(<variable> <value>... [PARENT_SCOPE])

设置环境变量

set(ENV{<variable>} <value>...)

include

include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>] [NO_POLICY_SCOPE])

从一个文件或模块加载并且运行cmake代码

Project Commands

add_executable

add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])

用指定的源文件创建一个可执行文件

创建一个名字为name 的可执行文件,name 在一个工程内必须是全局唯一的,可执行文件的实际名字会根据所在平台从新构造,

(such as <name>.exe or just <name>).

add_library

add_library
Normal Libraries
Imported Libraries
Object Libraries
Alias Libraries
Interface Libraries

Normal Libraries

add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])

创建一个名字为name 的库,name 在一个工程内必须是全局唯一的,实际名字会根据所在平台进行转化,

(such as lib<name>.a or <name>.lib).

库的类型也许被指定为:STATIC, SHARED, or MODULE 。静态库在链接到其它文件的时候被使用,动态库是动态链接在运行时加载,

MODULE 库不被链接到别的文件,也许在运行时被加载。

如果没有说明是静态还是共享,则依据变量BUILD_SHARED_LIBS是否打开来确定类型。

如果变量BUILD_SHARED_LIBS没有使用,默认是静态库,用法示例:

add_library(archive SHARED archive.cpp zip.cpp lzma.cpp)
add_library(archive STATIC archive.cpp zip.cpp lzma.cpp)

aux_source_directory

aux_source_directory(<dir> <variable>)

把目录“dir”中的所有源文件的名字存在变量"variable"中。

include_directories

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

为编译器器添加头文件的搜索路径,这些头文件目录将被添加到当前的CMakeLists文件的INCLUDE_DIRECTORIES属性中。

project

project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[LANGUAGES <language-name>...])

为整个工程设置名称,版本,和使用的语言。

设置的工程名存储在变量PROJECT_NAME中。

cmake_minimum_required

cmake_minimum_required(VERSION major.minor[.patch[.tweak]] [FATAL_ERROR])

这个命令放在 CMakeLists.txt 的最前面,为工程设定最低的cmake版本。

如果cmake版本低于要求,会停止编译,并报错。

编译选项宏设置

(ref)[https://www.linuxidc.com/Linux/2014-03/98622.htm]

三 生成可调试版本的程序

1使用CMAKE编译确实很方便。但CMAKE默认编译出来的程序不带有符号文件,用GDB无法调试。

2 要编译时产生符号文件供调试,调用CMAKE时,带上 -DCMAKE_BUILD_TYPE=Debug

例如:在build文件中输入:

cmake .. -DCMAKE_BUILD_TYPE=Debug

这样产生的makefile文件make生成的可执行文件就带有调试信息,供gdb和gdbserver使用了。

*****另外有另一种更好的方法是在工程主CMakeLists.txt中的PROJECT语句后加入一句

SET(CMAKE_BUILD_TYPE Debug)

CMake 中有一个变量 CMAKE_BUILD_TYPE ,可以的取值是 Debug Release RelWithDebInfo 和 MinSizeRel。当这个变量值为 Debug 的时候,CMake 会使用变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG 中的字符串作为编译选项生成 Makefile ,当这个变量值为 Release 的时候,工程会使用变量 CMAKE_CXX_FLAGS_RELEASE 和 CMAKE_C_FLAGS_RELEASE 选项生成 Makefile。

gcc 编译时候加入宏信息

编译时需添加-gdwarf-2和-g3两个参数。

加了-g3的参数后,gcc编译的时候,会将扩展的debug 信息编译进二进制文件里面,包括宏定义信息。

https://blog.csdn.net/zhangjs0322/article/details/39666889

Cmake用法的更多相关文章

  1. CMake 用法导览

    Preface : 本文是CMake官方文档CMake Tutorial (http://www.cmake.org/cmake/help/cmake_tutorial.html) 的翻译.通过一个样 ...

  2. cmake用法及常用命令总结(全)

    CMakeLists.txt 的语法比较简单,由命令.注释和空格组成,其中命令是不区分大小写的.指令是大小写无关的,参数和变量是大小写相关的.但推荐全部使用大写指令.符号 # 后面的内容被认为是注释. ...

  3. cmake用法(转)

    转自:http://blog.csdn.net/dbzhang800/article/details/6314073 新工作中使用到了cmake,所以找点资料学习一下,这篇讲的确实不错,转过来保存一下 ...

  4. 自己常用的CMake用法总结

    欢迎指正 CMake : A.download : https://cmake.org/download/ B.tutorial: https://cmake.org/cmake-tutorial/ ...

  5. cmake用法及常用命令总结

    CMakeLists.txt 的语法比较简单,由命令.注释和空格组成,其中命令是不区分大小写的.指令是大小写无关的,参数和变量是大小写相关的.但推荐全部使用大写指令.符号 # 后面的内容被认为是注释. ...

  6. CMake入门实战

    本文用来记录基本的Cmake用法,以一个实例,讲解如何通过cmake构建一个一个基本的工程,文件的目录如下: 说明: bin文件夹下的debug和release分别存放编译输出的文件和相关依赖的动态库 ...

  7. VS2015--win32project配置的一些想法之cmake

    近期两天都在配置一个win32项目.为了实现跨平台,写底层代码的人仅仅build了安卓和ios的工程,没有build win32项目. 因为对一些库不是非常了解.配置起来非常困难,心力交瘁. 为了实现 ...

  8. cmake 的简单使用示例

    https://www.zybuluo.com/khan-lau/note/254724 CMake 用法导览 Preface : 本文是CMake官方文档CMake Tutorial (http:/ ...

  9. CMake技术总结

    在做算法部署的过程中,我们一般都是用C++开发,主要原因是C++的高效性,而构建维护一个大型C++工程的过程中,如何管理不同子模块之间的依赖.外部依赖库.头文件和源文件如何隔离.编译的时候又该如何相互 ...

随机推荐

  1. MySQL建表规范

    一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...

  2. curl 模拟 GET\POST 请求,以及 curl post 上传文件

    curl GET 请求 curl命令 + 请求接口的地址. curl localhost:9999/api/daizhige/article 如上,我们就可以请求到我们的数据了,如果想看到详细的请求信 ...

  3. LINUX系统VMSTAT命令详解

    linux系统vmstat命令详解 [转自 https://www.cnblogs.com/wensiyang0916/p/6514820.html] vmstat 1    1表示每秒采集一次vms ...

  4. 【原创】大叔问题定位分享(14)Kylin频繁OOM问题

    公司一个kylin集群,每到周二下午就会逐个节点OOM退出,非常有规律,kylin集群5个节点,每个节点分配的内存已经不断增加到70多G,但是问题依旧: 经排查发现,每周二下午kylin集群的请求量确 ...

  5. 在DIV中如何控制字的位置?

    想到实现字体在div中处于上图(右下角)的位置的话,只需在字体样式上面加上这行代码就好了:style='margin-top:120px;height:20px;float:right;text-al ...

  6. 【转】Java Socket编程基础及深入讲解

    原文:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html#q2.3.3 Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要 ...

  7. scrapy_redis 相关: 将 jobdir 保存的爬虫进度转移到 Redis

    0.参考 Scrapy 隐含 bug: 强制关闭爬虫后从 requests.queue 读取的已保存 request 数量可能有误 1.说明 Scrapy 设置 jobdir,停止爬虫后,保存文件目录 ...

  8. ELK对Tomcat日志双管齐下-告警触发/Kibana日志展示

    今天我们来聊一聊Tomcat,相信大家并不陌生,tomcat是一个免费开源的web应用服务器,属于轻量级的应用程序,在小型生产环境和并发不是很高的场景下被普遍使用,同时也是开发测试JSP程序的首选.也 ...

  9. 配置maven项目的开发时的默认jdk版本

    配置所有maven项目的默认jdk版本,若不配置则提示"Warning:java: 源值1.5已过时, 将在未来所有发行版中删除" 在settings.xml文件中profiles ...

  10. 自学华为IoT物联网_08 IoT连接管理平台介绍

    点击返回自学华为IoT物流网 自学华为IoT物联网_08 IoT连接管理平台介绍 一.IoT连接管理平台的由来 1.1  物联网产业发展面临的挑战 新业务上线周期长,应用碎片化,开发周期长,场频上市慢 ...