cmake 学习笔记(二)
这次应该简单看看语法和常用的命令了。
简单的语法
- 注释
# 我是注释
- 命令语法
COMMAND(参数1 参数2 ...)
- 字符串列表
A;B;C # 分号分割或空格分隔的值
- 变量(字符串或字符串列表)
|
set(Foo a b c) |
设置变量 Foo |
|
command(${Foo}) |
等价于 command(a b c) |
|
command("${Foo}") |
等价于 command("a b c") |
|
command("/${Foo}") |
转义,和 a b c无关联 |
- 流控制结构
IF()...ELSE()/ELSEIF()...ENDIF()
WHILE()...ENDWHILE()
FOREACH()...ENDFOREACH()
- 正则表达式
部分常用命令
|
INCLUDE_DIRECTORIES( "dir1" "dir2" ... ) |
头文件路径,相当于编译器参数 -Idir1 -Idir2 |
|
LINK_DIRECTORIES("dir1" "dir2") |
库文件路径。注意: |
|
AUX_SOURCE_DIRECTORY( “sourcedir” variable) |
收集目录中的文件名并赋值给变量 |
|
ADD_EXECUTABLE |
可执行程序目标 |
|
ADD_LIBRARY |
库目标 |
|
ADD_CUSTOM_TARGET |
自定义目标 |
|
ADD_DEPENDENCIES( target1 t2 t3 ) |
目标target1依赖于t2 t3 |
|
ADD_DEFINITIONS( "-Wall -ansi") |
本意是供设置 -D... /D... 等编译预处理需要的宏定义参数,对比 REMOVE_DEFINITIONS() |
|
TARGET_LINK_LIBRARIES( target-name lib1 lib2 ...) |
设置单个目标需要链接的库 |
|
LINK_LIBRARIES( lib1 lib2 ...) |
设置所有目标需要链接的库 |
|
SET_TARGET_PROPERTIES( ... ) |
设置目标的属性 OUTPUT_NAME, VERSION, .... |
|
MESSAGE(...) |
|
|
INSTALL( FILES “f1” “f2”DESTINATION . ) |
DESTINATION 相对于 ${CMAKE_INSTALL_PREFIX} |
|
SET( VAR value [CACHE TYPE DOCSTRING [FORCE]]) |
|
|
LIST( APPEND|INSERT|LENGTH|GET| REMOVE_ITEM|REMOVE_AT|SORT ...) |
列表操作 |
|
STRING( TOUPPER|TOLOWER|LENGTH| SUBSTRING|REPLACE|REGEX ...) |
字符串操作 |
|
SEPARATE_ARGUMENTS( VAR ) |
转换空格分隔的字符串到列表 |
|
FILE( WRITE|READ|APPEND|GLOB| GLOB_RECURSE|REMOVE|MAKE_DIRECTORY ...) |
文件操作 |
|
FIND_FILE |
注意 CMAKE_INCLUDE_PATH |
|
FIND_PATH |
注意 CMAKE_INCLUDE_PATH |
|
FIND_LIBRARY |
注意 CMAKE_LIBRARY_PATH |
|
FIND_PROGRAM |
|
|
FIND_PACKAGE |
注意 CMAKE_MODULE_PATH |
|
EXEC_PROGRAM( bin [work_dir] ARGS <..> [OUTPUT_VARIABLE var] [RETURN_VALUE var] ) |
执行外部程序 |
|
OPTION( OPTION_VAR “description” [initial value] ) |
变量
工程路径
- CMAKE_SOURCE_DIR
- PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR
这三个变量指代的内容是一致的,是工程顶层目录
- CMAKE_BINARY_DIR
- PROJECT_BINARY_DIR
<projectname>_BINARY_DIR
这三个变量指代的内容是一致的,如果是in source编译,指得就是工程顶层目录,如果 是out-of-source编译,指的是工程编译发生的目录
CMAKE_CURRENT_SOURCE_DIR
指的是当前处理的CMakeLists.txt所在的路径。
CMAKE_CURRRENT_BINARY_DIR
如果是in-source编译,它跟CMAKE_CURRENT_SOURCE_DIR一致,如果是out-ofsource 编译,他指的是target编译目录。
CMAKE_CURRENT_LIST_FILE
输出调用这个变量的CMakeLists.txt的完整路径
CMAKE_BUILD_TYPE
控制 Debug 和 Release 模式的构建
- CMakeList.txt文件
SET(CMAKE_BUILD_TYPE Debug)
- 命令行参数
cmake DCMAKE_BUILD_TYPE=Release
编译器参数
- CMAKE_C_FLAGS
- CMAKE_CXX_FLAGS
也可以通过指令ADD_DEFINITIONS()添加
CMAKE_INCLUDE_PATH
- 配合 FIND_FILE() 以及 FIND_PATH() 使用。如果头文件没有存放在常规路径(/usr/include, /usr/local/include等),
则可以通过这些变量就行弥补。如果不使用 FIND_FILE 和 FIND_PATH的话,CMAKE_INCLUDE_PATH,没有任何作用。
CMAKE_LIBRARY_PATH
配合 FIND_LIBRARY() 使用。否则没有任何作用
CMAKE_MODULE_PATH
cmake 为上百个软件包提供了查找器(finder):FindXXXX.cmake
当使用非cmake自带的finder时,需要指定finder的路径,这就是CMAKE_MODULE_PATH,配合 FIND_PACKAGE()使用
CMAKE_INSTALL_PREFIX
控制make install是文件会安装到什么地方。默认定义是/usr/local 或 %PROGRAMFILES%
BUILD_SHARED_LIBS
如果不进行设置,使用ADD_LIBRARY且没有指定库类型,默认编译生成的库是静态库。
UNIX 与 WIN32
- UNIX,在所有的类UNIX平台为TRUE,包括OS X和cygwin
- WIN32,在所有的win32平台为TRUE,包括cygwin
参考
- Cmake Practice --Cjacker
- 转自:http://blog.csdn.net/dbzhang800/article/details/6329068
cmake 学习笔记(二)的更多相关文章
- CMake学习笔记二:cmake 常用变量和常用环境变量
1 cmake 变量引用的方式 使用 ${} 进行变量的引用.在 IF 等语句中,是直接使用变量名而不通过 ${} 取值. 2 cmake 自定义变量的方式 主要有隐式定义和显式定义两种,举一个隐式定 ...
- CMake学习笔记二
CMake预定义变量 PROJECT_SOURCE_DIR 工程的根目录 PROJECT_BINARY_DIR 运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/build ...
- cmake 学习笔记(三)
转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cma ...
- cmake 学习笔记(三) (转)
接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我 ...
- WPF的Binding学习笔记(二)
原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...
- AJax 学习笔记二(onreadystatechange的作用)
AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...
- [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计
源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...
- JMX学习笔记(二)-Notification
Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...
- cmake学习笔记(五)
在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使 ...
随机推荐
- c++类的实例化,有没有new的区别
A a; A * a = new a(); 以上两种方式皆可实现类的实例化,有new的区别在于: 1.前者在堆栈中分配内存,后者为动态内存分配,在一般应用中是没有什么区别的,但动态内存分配会使对象的可 ...
- 2015 5.16 C# 继承和多态
类的层次结构有两种基本的构造方式 自顶向下 自底向上 基类的保护成员是指允许派生类的方法代码访问,而不是指通过派生类的对象访问 如果基类中的字段通过公有且可读写的属性进行了封装,那么建议将字段定义 ...
- Android应用开发提高篇(1)-----获取本地IP
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html 一.概述 习惯了Linux下的网络编程,在还没用智能机之前就一直想 ...
- OA项目总结
一.自定义拦截器: 继承AbstractInterceptor,覆写intercept方法,实现功能逻辑,最后在Struts.xml文件中配置了自定义拦截器,首先自定义拦截器栈, <!- ...
- php内核一 一次请求与结束
php开始 到 结束 有两个阶段 请求开始之间的初始化阶段 请求之后的结束处理阶段 开始阶段: 模块初始化 模块激活 模块初始化: 在整个SAPI生命周期内,只执行一次(apache服务器启动的 ...
- Google地图,Baidu地图数据供应商
http://janwen.iteye.com/blog/488659 Google百度 我老以为百度,Google的地图产品是自己开发的,原来是别人提供的数据, 百度的数据提供商有 北京世纪高通科 ...
- Linux 网络编程: xinetd time
前言 终于把 xinetd 服务装好了,那就在来实现一下 TCP 协议从服务器和本机获取时间吧.那么多思想汇报还没写,我也是醉了. 安装 xinetd apt-get install xinetd 配 ...
- MVC-03 控制器(2)
五.ActionResult解说 ActionResult的继承图: 类型 Controller辅助方法 用途帮助 ContentResult Content 回传一个用户自定义的文字属性 Empty ...
- javascript收集整理
//特殊字符去掉 function check(obj){ var test=obj.value.match(/[^A-Za-z0-9]/g);//这条语句表示在输入文本中是否包含不符合要求的字符,如 ...
- eclipse编译错误
ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2 JDWP exit error AGE ...