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使 ...
随机推荐
- 关于windows服务的操作
/// <summary> /// 判断是否安装了某个服务 /// </summary> /// <param name="serviceName"& ...
- BootStrap 智能表单系列 二 BootStrap支持的类型简介
代码如下(链接地址:https://github.com/xiexingen/Bootstrap-SmartForm/blob/master/demo/form1-basic.html): <! ...
- 我用过的linux命令--安装Hadoop
1. hadoop软件传送给虚拟机 还是利用WinSCP把hadoop软件安装包,放到linux的Downloads文件夹中. 2. 选择安装目录 把hadoop安装包copy到这个安装目录中,这里我 ...
- 基本event封装:阻止冒泡、默认事件等
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> ...
- 关于input标签的需要注意的几个小问题
1.input元素没有结束标签,只有开始标签,即使写上结束标签也不起作用.如下 <input type="text" value="text" /> ...
- Python之登陆接口设计
刚刚开始学习Python,第一个编写的程序. import os user_file = open('use_file.txt', 'r') user_list = user_file.readlin ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
- android中使用jni对字符串加解密实现分析
android中使用jni对字符串加解密实现分析 近期项目有个需求.就是要对用户的敏感信息进行加密处理,比方用户的账户password,手机号等私密信息.在java中,就对字符串的加解密我们能够使用A ...
- Oracle EBS Web ADI 中的术语
Oracle EBS Web ADI 中的术语 (版权声明,本人原创或者翻译的文章如需转载,如转载用于个人学习,请注明出处:否则请与本人联系,违者必究) 异步调用异步调用是这样子的,和引入接口表中的数 ...
- Swift与Objective-C API的交互
互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言.当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定 ...