CMake的使用

一、      基本使用

安装:下载二进制包后可直接解压使用

从源码安装则执行命令:./bootstrap; make; make install——尝试执行bootstrap失败

使用:cmake dir_path,生成工程文件或makefile文件

二、      概念

out-of-source build,与in-source build相对,即将编译输出文件与源文件放到不同目录中;

三、      基本结构

1,依赖CMakeLists.txt文件,项目主目标一个,主目录中可指定包含的子目录;

2,在项目CMakeLists.txt中使用project指定项目名称,add_subdirectory添加子目录

3,子目录CMakeLists.txt将从父目录CMakeLists.txt继承设置(TBD,待检验)

四、      语法

1.       #注释

2.       变量:使用set命令显式定义及赋值,在非if语句中,使用${}引用,if中直接使用变量名引用;后续的set命令会清理变量原来的值;

3.       command (args ...)  #命令不分大小写,参数使用空格分隔,使用双引号引起参数中空格

4.       set(var a;b;c) <=> set(var a b c)  #定义变量var并赋值为a;b;c这样一个string list

5.       Add_executable(${var}) <=> Add_executable(a b c)   #变量使用${xxx}引用

6.       条件语句:

if(var) #var 非empty 0 N No OFF FALSE... #非运算使用NOT

       …

else()/elseif() … endif(var)

7.       循环语句

Set(VAR a b c)

Foreach(f ${VAR})       …Endforeach(f)

8.       循环语句

WHILE() … ENDWHILE()

五、      内部变量

CMAKE_C_COMPILER:指定C编译器

CMAKE_CXX_COMPILER

CMAKE_C_FLAGS:编译C文件时的选项,如-g;也可以通过add_definitions添加编译选项

EXECUTABLE_OUTPUT_PATH:可执行文件的存放路径

LIBRARY_OUTPUT_PATH:库文件路径

CMAKE_BUILD_TYPE::build 类型(Debug, Release, ...),CMAKE_BUILD_TYPE=Debug

BUILD_SHARED_LIBS:Switch between shared and static libraries

内置变量的使用:

>> 在CMakeLists.txt中指定,使用set

>> cmake命令中使用,如cmake -DBUILD_SHARED_LIBS=OFF

六、      命令

project (HELLO)   #指定项目名称,生成的VC项目的名称;

>>使用${HELLO_SOURCE_DIR}表示项目根目录

include_directories:指定头文件的搜索路径,相当于指定gcc的-I参数

>> include_directories (${HELLO_SOURCE_DIR}/Hello)  #增加Hello为include目录

link_directories:动态链接库或静态链接库的搜索路径,相当于gcc的-L参数

       >> link_directories (${HELLO_BINARY_DIR}/Hello)     #增加Hello为link目录

add_subdirectory:包含子目录

       >> add_subdirectory (Hello)

add_executable:编译可执行程序,指定编译,好像也可以添加.o文件

       >> add_executable (helloDemo demo.cxx demo_b.cxx)   #将cxx编译成可执行文件——

add_definitions:添加编译参数

>> add_definitions(-DDEBUG)将在gcc命令行添加DEBUG宏定义;

>> add_definitions( “-Wall -ansi –pedantic –g”)

target_link_libraries:添加链接库,相同于指定-l参数

>> target_link_libraries(demo Hello) #将可执行文件与Hello连接成最终文件demo

add_library:

>> add_library(Hello hello.cxx)  #将hello.cxx编译成静态库如libHello.a

add_custom_target:

message( status|fatal_error, “message”):

set_target_properties( ... ): lots of properties... OUTPUT_NAME, VERSION, ....

link_libraries( lib1 lib2 ...): All targets link with the same set of libs

七、      说明

1,CMAKE生成的makefile能够处理好.h文件更改时只编译需要的cpp文件;

八、      FAQ

1)  怎样获得一个目录下的所有源文件

>> aux_source_directory(<dir> <variable>)

>> 将dir中所有源文件(不包括头文件)保存到变量variable中,然后可以add_executable (ss7gw ${variable})这样使用。

2)  怎样指定项目编译目标

>>  project命令指定

3)  怎样添加动态库和静态库

>> target_link_libraries命令添加即可

4)  怎样在执行CMAKE时打印消息

>> message([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)

>> 注意大小写

5)  怎样指定头文件与库文件路径

>> include_directories与link_directories

>>可以多次调用以设置多个路径

>> link_directories仅对其后面的targets起作用

6)  怎样区分debug、release版本

>>建立debug/release两目录,分别在其中执行cmake -DCMAKE_BUILD_TYPE=Debug(或Release),需要编译不同版本时进入不同目录执行make即可;

Debug版会使用参数-g;Release版使用-O3 –DNDEBUG

>> 另一种设置方法——例如DEBUG版设置编译参数DDEBUG

IF(DEBUG_mode)

    add_definitions(-DDEBUG)

ENDIF()

在执行cmake时增加参数即可,例如cmake -D DEBUG_mode=ON

7)  怎样设置条件编译

例如debug版设置编译选项DEBUG,并且更改不应改变CMakelist.txt

>> 使用option command,eg:

option(DEBUG_mode "ON for debug or OFF for release" ON)

IF(DEBUG_mode)

    add_definitions(-DDEBUG)

ENDIF()

>> 使其生效的方法:首先cmake生成makefile,然后make edit_cache编辑编译选项;Linux下会打开一个文本框,可以更改,该完后再make生成目标文件——emacs不支持make edit_cache;

>> 局限:这种方法不能直接设置生成的makefile,而是必须使用命令在make前设置参数;对于debug、release版本,相当于需要两个目录,分别先cmake一次,然后分别make edit_cache一次;

>> 期望的效果:在执行cmake时直接通过参数指定一个开关项,生成相应的makefile——可以这样做,例如cmake –DDEBUGVERSION=ON

8)  怎样添加编译宏定义

>> 使用add_definitions命令,见命令部分说明

9)  怎样添加编译依赖项

用于确保编译目标项目前依赖项必须先构建好

>>add_dependencies

10)        怎样指定目标文件目录

>> 建立一个新的目录,在该目录中执行cmake生成Makefile文件,这样编译结果会保存在该目录——类似

>> SET_TARGET_PROPERTIES(ss7gw PROPERTIES

                      RUNTIME_OUTPUT_DIRECTORY "${BIN_DIR}")

11)        很多文件夹,难道需要把每个文件夹编译成一个库文件?

>> 可以不在子目录中使用CMakeList.txt,直接在上层目录中指定子目录

12)        怎样设定依赖的cmake版本

>>cmake_minimum_required(VERSION 2.6)

13)        相对路径怎么指定

>> ${projectname_SOURCE_DIR}表示根源文件目录,${ projectname _BINARY_DIR}表示根二进制文件目录?

14)        怎样设置编译中间文件的目录

>> TBD

15)        怎样在IF语句中使用字串或数字比较

>>数字比较LESS、GREATER、EQUAL,字串比STRLESS、STRGREATER、STREQUAL,

>> Eg:

set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)

set(AAA abc)

IF(AAA STREQUAL abc)

    message(STATUS "true")   #应该打印true

ENDIF()

16)        更改h文件时是否只编译必须的cpp文件

>> 是

17)        机器上安装了VC7和VC8,CMAKE会自动搜索编译器,但是怎样指定某个版本?

>> TBD

18)        怎样根据OS指定编译选项

>> IF( APPLE ); IF( UNIX ); IF( WIN32 )

19)        能否自动执行某些编译前、后命令?

>> 可以,TBD

20)        怎样打印make的输出

make VERBOSE=1

参考文献:

[1] CMake_Tutorial.pdf

[2] CMake使用总结,http://blog.csdn.net/keensword007/archive/2008/07/16/2663235.aspx

[3] http://www.cmake.org/

[4] 安装包中文档

[5] Andrej Cedilnik,HOWTO: Cross-Platform Software Development Using CMake,October, 2003

[6] Cjacker,CMake实践.PDF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP实训笔记,【学习笔记19】实验吧 让我进去

知识点MD5拓展攻击解题思路打开网站后看到&#xff0c;什么都没有&#xff0c;尝试抓包分析360截图17860604827894.PNGBurp 抓包发现&#xff0c;Cookie有东西。先是把source0改成source1,得到源码。、、、$flag "XXXXXXXXXXXXXXXXXXXXXXX";$secret "XXXXXXXX…

CMake PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR区别

看了好多网上的文章&#xff0c;都说PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR是等价的。 实际不然。 一般来说&#xff0c;都是这样用 cmake ./ 这样PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR是等价的。也就是当前源码的目录。 如果执行cmake的时候&#xff0c;并不在源码…

toolStrip 按钮图片大小的修改

http://www.cnblogs.com/smallsoftfox/archive/2012/06/21/2558323.html转载于:https://www.cnblogs.com/PatrickLee/p/3526708.html

oracle11g数据文件路径,oracle11g trace路径和diagnostics路径的变化

Oracle11g中trace文件和日志文件的路径发生了变化在$ORACLE_BASE/diag建立了一些分类目录&#xff0c;用来保存各种日志&#xff1a;[oraclerac1 trace]$ cd $ORACLE_BASE[oraclerac1 oracle]$ cd diag[oraclerac1 diag]$ pwd/u01/app/oracle/diag[oraclerac1 diag]$ lsasm cli…

qt for v210

1. v210本身自带了qt4.8.4的qt库&#xff0c;路径在/usr/lib下面。但是我们需要对屏幕进行90度旋转。因此需要重新编译qt库。 我们编译了qt4.8.5的qt库&#xff0c;把/usr/lib下面libQt*删除&#xff0c;将编译好的libQt*拷贝过来即可。 2. 因为我们只用自己增加的文泉驿字体&…

DataGridView数据导入到Excel 中

#region DataGridView数据显示到Excel /// <summary> /// 打开Excel并将DataGridView控件中数据导出到Excel /// </summary> /// <param name"dgv">DataGridView对象 </param> /// <param name"isShowExcle">是…

cmake学习(一)静态库与动态库构建

(.so)共享库&#xff0c;shared object&#xff1a;节省空间&#xff0c;在运行时去连接&#xff0c;如果执行机器上没有这些库文件就不能执行。(.a)静态库,archive&#xff1a;静态库和程序化为一体&#xff0c;不会分开。通过 ldd命令可以查看一个可执行程序所依赖的的共享库…

oracle查表占的物理空间,查询Oracle表实际物理使用大小

Oracle中有两种含义的表大小一种是分配给一个表的物理空间数量&#xff0c;而不管空间是否被使用。可以这样查询获得字节数&#xff1a;select segment_name, bytesfrom user_segmentswhere segment_type TABLE;效果如下&#xff1a;或者Select Segment_Name,Sum(bytes)/1024/…

分布模式

Remote Facade远程外观 在OO模型中,存在很多规模小,且有小方法的对象.这些小对象会导致很多的对象间交互.在单一地址空间里,小对象没问题.但是,当在两个进程间做调用时,频繁的跨进程交互会造成性能开销.远程外观,减少远程调用的次数. 建立在大量的细粒度对象之上,提供一个粗粒度…

oracle分区表带入SQL语句,Oracle 分区表常用SQL语句 (转载)

*********为分区表建立一个单独的表空间*********/create tablespace ts_partition datafile /home/oracle/oradata/esales/partition.dbf size 10Mextent management local uniform size 2M;/*********建立分区表*********/create table bigtable(sale_date date,product_id n…

QT中PRO文件写法的详细介绍

在QT中&#xff0c;有一个工具qmake可以生成一个makefile文件&#xff0c;它是由.pro文件生成而来的&#xff0c;.pro文件的写法如下&#xff1a; 1. 注释 从“#”开始&#xff0c;到这一行结束。 2.模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择&am…

POJ 2485 Highways(最小生成树 Prim)

Highways大意&#xff1a;给你一个用邻接矩阵形式存储的有n个顶点的无向图&#xff0c;让你求它的最小生成树并求出在这个生成树里面最大的边的权值。 思路&#xff1a;用Prim求&#xff0c;判断条件改一下就行。 PS&#xff1a;dis数组初始化的时候用memset一直RE&#xff0c;…

oracle10g rac启动,ORACLE 10G RAC启动与关闭

rootnode-rac1 ~]# su - oracle关闭node-rac1[oraclenode-rac1 ~]$ cd /app/crs/product/10201/crs/bin/[oraclenode-rac1 bin]$ ./srvctl stop instance -d racdb -i racdb1[oraclenode-rac1 bin]$ ./srvctl stop asm -n node-rac1[oraclenode-rac1 bin]$ ./srvctl stop nodea…

iwconfig的用法(转)

1. 打开无线网卡电源iwconfig wlan0 txpower on2. 列出区域内的无线网络iwlist wlan0 scan3. 假设要连接到网络MyHome&#xff08;即essid为MyHome的网络&#xff09;&#xff0c;那么输入命令iwconfig wlan0 essid “MyHome” 如果网络是加密的&#xff0c;密码是0123456789&a…

oracle用户获取datameta权限,Oracle数据库提权(低权限提升至dba)

0x01 Oracle存储过程”缺陷”在 Oracle 的存储过程中&#xff0c;有一个有趣的特点&#xff1a;运行权限。运行权限分为两种&#xff0c;definer 和 invoker。definer 为函数创建者的权限&#xff0c;而 invoker 则是当前调用函数的用户。运行权限在函数创建时就已经被钦定了&a…

__thread 和 __typeof__关键字

__thread:在多线程变成中&#xff0c;使用于global变量&#xff0c;使每个线程都私有一份。static __thread int count;void *function1(void *argc){printf("porgran pid:%u, the function1 pthread id is %lu, count:%d\n",getpid(), pthread_self(), count);count…

RSA openssl_public_encrypt false

这个问题困扰了我好久&#xff0c;最后发现&#xff0c;原来这个函数只能最大长度为117个字节。如果加密的串超过这个长度&#xff0c;就会返回false。转载于:https://www.cnblogs.com/gpfeisoft/p/3533479.html

linux将文件下载到本地windows,XSHELL下直接下载文件到本地(Windows)

xshell很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz首先你的Ubuntu需要安装rz.sz(如果没有安装请执行以下命令,安装完的请跳过.其它版本linux请自行安装相应软件)yum install lrzsz安装完毕即可使用rz&#xff0c;sz是便是Linux/Uni…

C++11 标准新特性: 右值引用与转移语义

原文地址 http://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ C 的新标准 C11 已经发布一段时间了。本文介绍了新标准中的一个特性&#xff0c;右值引用和转移语义。这个特性能够使代码更加简洁高效。 新特性的目的 右值引用 (Rvalue Referene) 是 C 新标准 (…

android远程linux命令,测试可用的Android远程语音识别实例

测试可用的Android远程语音识别实例:代码下载在&#xff1a;相关文件下载在Linux公社的1号FTP服务器里&#xff0c;下载地址&#xff1a;用户名&#xff1a;www.linuxidc.com密码&#xff1a;www.muu.cc在 2011年LinuxIDC.com\10月\10月\测试可用的Android远程语音识别实例pack…