文档章节

【整理】CMake 介绍和 CMake 实践

摩云飞
 摩云飞
发布于 2012/11/16 13:15
字数 1594
阅读 540
收藏 8
点赞 0
评论 2

【CMake 优点】:

  1. 开放源代码,使用 BSD 许可证发布。
  2. 跨平台,可以生成 native 编译配置文件。在 linux/unix 平台可以生成 makefile,在 mac 平台可以生成 xcode,在 windows 平台可以生成 msvc 工程的配置文件。
  3. 能够管理大型项目。
  4. 简化编译构建过程和编译过程,只需要 cmake + make 就可以。
  5. 高效率。
  6. 可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。

【如何安装 CMake】:

1. CMake 的安装可以使用 autotools 进行安装,点击cmake-2.8.6.tar.gz链接,可以对软件进行下
2. 执行 ./configure; make; make install

CMake的原理】 

准备main.cpp文件

//main.cpp

#include<cstdio>

int main()
{
    printf("hello world from main\n");
    return 0;
}

a.创建 CMakeLists.txt(注意:此文件名大小写必须如此命名),向该文件中加入以下几行(内容中命令的大小写无所谓):

PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

b.运行以下命令(linux下):

$ cmake .                (别忘记加上这个点,表示当前目录)

执行完该命令后执行ls可以看到:

生成了CMakeFiles(目录)、CMakeCache.txtcmake_install.cmake以及Makefile文件。
c.执行make。

这时当前目录下就会生成可执行文件:

【例子解释】:

上面CMakeLists.txt的内容重新列出如下: 

PROJECT (HELLO)
SET(SRC_LIST main.cpp)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

PROJECT指令的语法:
PROJECT(projectname [CXX] [C] [JAVA]) 

该指令用来定义工程名称和工程支持的语言。这个指令也同时隐式定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR
在该例子中就是HELLO_BINARY_DIRHELLO_SOURCE_DIR,两个变量指的都是当前工程的路径。 
SET指令的语法:
SETVAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]] 

Set指令是用来显式的定义变量的,我们之前用到的是SET(SRC_LIST main.cpp),如果有多个源文件,也可以定义成SET(SRC_LIST main.cpp t1.cpp t2.cpp) 
MESSAGE指令的语法是:
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...) 

这个指令用于向终端输出用户信息,包含三种类型:

  1. SEND_ERROR,产生错误,生成过程被跳过。
  2. SATUS,输出前缀为-的信息。
  3. FATAL_ERROR,立即终止所有cmake过程。 


上例使用的是STATUS类型进行信息输出,用于显示由PROJECT指令隐式定义的两个变量HELLO_BINARY_DIRHELLO_SOURCE_DIR的值。 

ADD_EXECUTABLE(hello ${SRC_LIST})

定义了这个,工程会生成一个文件名为hello的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表,本例中你可以直接写成ADD_EXECUTABLE(hello main.c)
本例CMakeLists.txt的最简化形式:

PROJECT(HELLO)
ADD_EXECUTABLE(hello main.c)

=== 我是分割线 ===

下面我们介绍一个比较实用的例子,既包含生成静态库又包含引入外部头文件和链接库的cmake demo
先按照工程规范建立工程目录并编写代码,以下面的工程目录为例进行解释这个例子,工程的目录结构为:

 

编译工程要实现的目标:

  • 添加子目录doc,用以放置这个工程的文档hello.txt
  • 生成hello的静态库,并在main可执行程序链接hello静态库。
  • 在这个工程中添加COPYRIGHTREADME文件。
  • 在工程目录中添加一个run.sh的脚本,用以调用生成的二进制可执行文件。
  • 将生成的二进制文件生成到bin子目录中。
  • 编写安装程序。 

1. 编写CMakeLists.txt
      由于一个工程目录中包含多个项目,其中在此项目中包含util项目和main项目,其中util项目是用以生成main程序需要的静态库,main是用以生成可执行文件。
      在整个工程项目的根目录下的CMakeLists.txt是用来定义工程需要的CMake设置以及子目录src,用以递归调用src中的MakeLists.txt。该CMakeLists.txt的内容定义如下: 

PROJECT(HELLO)
ADD_SUBDIRECTORY(src)

      目录src中的CMakeLists.txt用以定义src目录下包含的两个工程(main和util)的依赖关系。
      目录util里面的CMakeLists.txt是用以定义生成util静态库的规则,其中内容如下:

SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)
SET(CMAKE_C_COMPILER g++)
SET(SRC_LIST hello.c) 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
ADD_LIBRARY(util STATIC ${SRC_LIST})


SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib) -- 定义了库生成的路径,内部变量LIBRARY_OUTPUT_PATH用于存放库的生成路径。 
SET(CMAKE_C_COMPILER g++) -- 定义C的编译器为g++,防止出现CC++代码在不指定C编译器的情况下默认使用gcc,导致系统编译混乱。 
SET(SRC_LIST hello.c) -- 定义库文件需要的源文件。
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include) -- 定义非标准库头文件要搜索的路径。 

其中INCLUDE_DIRECTORIES命令的格式为:
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
ADD_LIBRARY(util STATIC ${SRC_LIST}) -- 定义生成库的名字、类型和库所需要的源文件,

其中ADD_LIBRARY命令格式为:
ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)

      目录main里面的CMakeLists.txt是用来定义可执行程序编译和链接时所需要的一些命令或环境。内容如下: 

SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)
SET(SRC_LIST main.cpp) 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)
LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib) 

ADD_EXECUTABLE(hello ${SRC_LIST})
TARGET_LINK_LIBRARIES(hello util)


INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include) -- 定义工程引用的include文件夹位置,其中存放使用到的库的头文件。
LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib) -- 定义工程引用的库文件位置,其中存放着库文件。
ADD_EXECUTABLE(hello ${SRC_LIST}) -- 定义生成的可执行文件。
TARGET_LINK_LIBRARIES(hello util) -- 用以定义链接时需要的库文件。 

2.在工程目录下创建build目录,并采用out-of-source方式编译项目。执行命令

$ cmake ..

执行结果如下

 

执行tree命令,这时在build目录下生成了中间编译文件:

$ tree .

执行make命令,结果如下:

可以看到工程创建和编译成功了。 

3. 安装

      在工程目录下添加COPYRIGHTREADMErun.sh,重新编辑工程目录下的CMakeLists.txt。在CMakeLists.txt中添加如下命令: 

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)
INSTALL(PROGRAMS run.sh DESTINATION bin)
INSTALL(PROGRAMS bin/hello DESTINATION bin)
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)

      这些命令表示在执行make install命令时,安装程序会拷贝相应的文件、目录或程序到指定的前缀开始的目录中,cmake执行命令如下: 

cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..

      这时将工程目录安装到~/data/cmake_demo目录下。执行结果如下:

其中cmake编译cc++工程完毕。 

本文转载自:http://www.udpwork.com/item/6326.html

共有 人打赏支持
摩云飞
粉丝 367
博文 534
码字总数 952690
作品 0
徐汇
程序员
加载中

评论(2)

itfanr
itfanr
目录src中的CMakeLists.txt用以定义src目录下包含的两个工程(main和util)的依赖关系。

src下的CMakeLists.txt的内容是什么?
itfanr
itfanr
写得太棒了!解答了我不少疑问。
安装MySQL5.5时常见错误--缺失make

首先我这是一台CentOS release 6.2 (Final),新安装的系统,没有任何软件及库文件。安装mysql5.5之前,先需要大概了解一下,需要注意的信息,mysql5.5的安装与其它版本不同的是编译安装时,需...

SANSOM
2013/08/28
0
0
MySQL 安装 CMake Error CMAKE_CXX_COMPILER not set

新装的机器Gnome-Ubuntu-13.10,编译安装mysql-5.6.14.tar.gz 命令 cmake -DCMAKEINSTALLPREFIX=/usr/local/database/mysql5.6 -DSYSCONFDIR=/usr/local/database/mysql5.6/etc -DMYSQLDATAD......

白凡
2013/11/18
0
0
part01_Linux下使用Cmake构建工程

一、安装Cmake 1.下载cmake-3.11.1.tar.gz:https://cmake.org/download/ 2.把 cmake-3.11.1.tar.gz放到任意临时目录(Cmake默认安装在:/usr/local/中),查看其权限如果没有权限直接更改权限...

IT魔幻师
05/09
0
0
cmake命令 安装、用法简介

前言: cmake是kitware公司以及一些开源开发者在开发几个工具套件(VTK)的过程中所产生的衍生品。后来经过发展,最终形成体系,在2001年成为一个独立的开放源代码项目。其官方网站是www.cmake...

烦恼的大胖
2011/05/25
0
4
使用Cmake生成跨极速赛车平台出租平台项目编译解决方案

项目最近有需求在windows下面运行,我花了几周时间将linux的服务器移植到windows下面,目前已经能够正常运行服务器,目前又有了新需求,两边的代码结构和组织是分开的,因此为了两边能够同步...

inuuns
07/10
0
0
使用Cmake生成OA信用盘平台出租跨平台项目编译解决方案

项目最近OA信用盘平台出租 haozbbs.com Q1446595067 有需求在windows下面运行,我花了几周时间将linux的服务器移植到windows下面,目前已经能够正常运行服务器,目前又有了新需求,两边的代码...

tutuoia
07/10
0
0
qt5.3.1+opencv2.4.9编译环境的搭建

到官网下载qt-opensource-windows-x86-mingw482_opengl-5.3.1.exe文件,执行该文件,选择默认安装即可实现QT的安装(安装在C盘的根目录下),该文件封装好了Qt libraries、Qt Creator,其中Q...

peizhenfly
2015/04/05
0
0
MySQL CMake参数说明手册

MySQL自5.5版本以后,就开始使用CMake编译工具了,因此,你在安装源文件中找不到configure文件是正常的。很多人下到了新版的MySQL,因为找不到configure文件,不知道该怎么继续下去。有没有一...

mac_zhao
2014/11/19
0
0
源码编译mysql5.5过程记录

官网安装教程: http://dev.mysql.com/doc/refman/5.5/en/installing-source-distribution.html CentOS6.3源码安装mysql-5.5.27 #mysql5.5以上使用cmake代替configure编译,首先需要安装cma......

shezjl
2015/08/31
0
0
CentOS 5.5下安装MySQL 5.5全过程分享

打开终端 切换到根目录 [shell@localhost ~]# su -安装Mysql5.5之前先卸载CentOS自带的Mysql5.0。 [root@localhost ~]# yum remove mysql 安装cmake 下载cmake源码包cmake-2.8.5.tar.gz [roo......

vga
2015/03/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
2
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
1
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
1
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
2
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
1
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
1
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部