cmake总结
无论生活还是工作上,做过的事,需要总结下。
接触cmake,一般都会看一本书 <<cmake 实践>>. 这是cmake的入门书。我就不多说了。
下面说一下我对部分cmake命令的使用与理解,不正确的,请大家指点,谢谢!
1. 所有的注释,都以#开头。
#XXX Build Script
#CMakeLists.txt
#
#Copyright (c) 2011, L
#All rights reserved.
2. cmake版本的控制。
cmake_minimum_required (VERSION 2.8)
3. 定义项目名称。
PROJECT (xxx)
4. 如果想看到更多cmake编译时候的信息,置为ON,否则为OFF.
set(CMAKE_VERBOSE_MAKEFILE ON)
5. 在项目中,我们一般会用到一些第三方库。cmake支持一些,注意,只是部分。例如对Boost的支持,对apr的不支持。
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREAD ON)
find_package(Boost 1.4.3 REQUIRED)
如果你的机器上装有Boost,它会自动找出来,找不出来,就会报错,停止编译。(REQUIRED的作用)
在项目中,我们用到了apache runtime library(apr).cmake不支持,我的解决方法手动添加apr的路径。
例如:
#apr
SET(APR_ROOT $ENV{APR_DIST})
尝试写个.cmkae模块,用findXXX调用,但是不知道该如何如找apr的安装路径。有知道的朋友,希望指点,谢谢!
找到Boost后,我们会自动得到它的include路径和lib路径。
同时,我们可以得到一些库的名称。
MESSAGE(STATUS "Boost include path:" ${Boost_INCLUDE_DIRS})
MESSAGE(STATUS "Boost lib path:" ${Boost_LIBRARY_DIRS})
FIND_PACKAGE(Boost REQUIRED COMPONENTS system)
STRING(REPLACE "boost_system" "boost_regex" Boost_REGEX_LIBRARY ${Boost_SYSTEM_LIBRARY})
STRING(REPLACE "boost_system" "boost_regex" Boost_REGEX_LIBRARY_DEBUG ${Boost_SYSTEM_LIBRARY_DEBUG})
STRING(REPLACE "boost_system" "boost_regex" Boost_REGEX_LIBRARY_RELEASE ${Boost_SYSTEM_LIBRARY_RELEASE})
6. 如果你的cmake实现中,用到了一些模块,例如*.cmake.这个时候,需要
#set module path. for FindXXX.cmake
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
7. 创建宏。
例如你建的工程是unicode 编码,可以这样:
#set character set. unicode
add_definitions(-DUNICODE -D_UNICODE)
8. 添加子目录,它会去子目录中寻找CmakeLists.txt,然后执行它。
ADD_SUBDIRECTORY(subdir)
9. 将一个文件下的编译用的源文件添加到一个宏列表中。
AUX_SOURCE_DIRECTORY(. SRC_LIST)
注意,它只是将.cc .cpp .c的文件添加到SRC_LIST中,.h除外。
10. 如果你想将.h文件也加进来,使用
file (GLOB HEADERS "include/*.h")
SET(SRC_LIST ${SRC_LIST} ${HEADERS})
注意GLOB这个参数,它不支持子目录。如果你想让它支持子目录,用GLOB_RECURSE。
在vs中可以创建子文件夹,这样会使我们的项目看上去美观,规范。
cmake支持这一功能。
source_group(Include\\utils FILES ${HEADERS})
这个可以亲自试试,看看效果。在使用这个命令的时候,本想用regex,正则来处理,试过了好几次,发现cmake好像不怎么支持正则,例如Perl的语法。
例如:if(${f} MATCHES "(.*)(\.h)$")
如在这块有心得的朋友,希望指点下,哈哈。
11. 头文件包含路径及库路径
INCLUDE_DIRECTORIES
link_directories
12. 在windows+vs中,如果我们想改变项目的输出路径,dll, .lib,需要
IF(MSVC)
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/lib )
ELSE(MSVC)
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib )
ENDIF(MSVC)
13. 检查一个文件或目录是否存在,用
if(NOT EXISTS ${APR_ROOT})
endif()
注意这里的if,是小写的,用大写的,就会报错,为此,我折腾了半天。
14. cmake提供了gui界面。如果想使用界面方式,例如:设置变量MY_ROOT的值
SET(MY_ROOT "/usr/lib" CACHE PATH "my root path")
记得不要加FORCE。加上了,会rebuild,不是我们想要的效果。
好了,希望对用得到的朋友,有所帮助。谢谢!
cmake总结的更多相关文章
- 使用cmake自动构建工程
公司引擎是用cmake根据目标平台来构建工程的,刚接触的时候深深体会到cmake的方便:如果目标平台是windows,它可以帮你自动构建出vs工程:如果是安卓,自动构建出eclipse工程,如果是IO ...
- CMake
使用CMake编译跨平台静态库 http://www.tuicool.com/articles/3uu2Yj cmake命令 安装.用法简介 https://fukun.org/archives/04 ...
- CMake学习笔记
C++开发者必备技能CMake 先简单介绍一下,CMake是一个跨平台的编译工具,它可以根据不用的平台,不同的编译环境,生成不同的MakeFile,从而控制编译的过程. 使用CMake的步骤: 1. ...
- VS 2013编译64位版本QT 4.8.6及使用cmake为依赖QT生成VS项目时Could NOT find Qt4
对于一些已经解决的问题,本博客不再讨论.只将本人遇到的问题做简单的说明. 一.VS 2013编译64位版本QT 4.8.6 QT项目官网中,对于QT4,其只提供了windows X86的版本,并且支持 ...
- cmake cannot find package
cmake 找不到package,如 find_package (OpenMesh REQUIRED) 出现错误 在项目的文件夹中找到 FindOpenMesh.cmake 文件,将其所在路径添加到 ...
- Cmake的交叉编译
http://www.cmake.org/Wiki/CMake_Cross_Compiling
- CMake命令/函数汇总(翻译自官方手册)
查看官方文档 cmake命令 选项 CMake变量 CMake命令汇总 / add_custom_command add_custom_target/add_definitions/add_depen ...
- 《CMake实践》笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记二:INSTALL/CMAKE_INSTALL_PREFIX
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
- 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
<CMake实践>笔记一:PROJECT/MESSAGE/ADD_EXECUTABLE <CMake实践>笔记二:INSTALL/CMAKE_INSTALL_PREFIX &l ...
随机推荐
- JSPatch技术文档
一.背景需求介绍 为什么我们需要一个热修复(hot-fix)技术? 工作中容易犯错.bug难以避免. 开发和测试人力有限. 苹果Appstore审核周期太长,一旦出现严重bug难以快速上线新版本. 作 ...
- discuz bbs注册,登录流程整理!想打通bbs又不想读一遍代码可以参考一下
bbs 用户注册流程 第一步: /source/class/class_member.php: on_register注册入口 L602 左右 if(!$activation) {//不为空,说明用户 ...
- Apache JMeter开源压力测试/负载测试工具 2.12 官方最新版
软件介绍 Jmeter是一款使用Java开发的,开源免费的,测试工具, 主要用来做功能测试和性能测试(压力测试/负载测试),而且用Jmeter 来测试 Restful API, 非常好用. 如何学 ...
- jquery日历签到控件的实现
calendar.js var calUtil = { //当前日历显示的年份 showYear:2015, //当前日历显示的月份 showMonth:1, //当前日历显示的天数 showDays ...
- poj 2513
http://poj.org/problem?id=2513 73348K 1438MS C++ 1614B解题思路:欧拉路的应用 要点 :1.判断连通性 ...
- Vmware虚拟机网络模式及虚拟机与物理机通信方法
[转]http://www.cqeis.com/news_detail/newsId=1477.html Vmware虚拟机软件是一个“虚拟PC”软件,它使你可以在一台机器上同时运行二个或更多Wind ...
- Windows Phone 8初学者开发—第4部分:XAML简介
原文 Windows Phone 8初学者开发—第4部分:XAML简介 原文地址: http://channel9.msdn.com/Series/Windows-Phone-8-Developme ...
- C++数据结构之图
图的实现是一件很麻烦的事情,很多同学可能在学数据结构时只是理解了图的基本操作和遍历原理,但并没有动手实践过.在此,我说说我的实现过程. 首先,在草稿纸上画一个图表,这里是有向图,无向图也一样,如下: ...
- HDU2276 - Kiki & Little Kiki 2(矩阵高速幂)
pid=2276">题目链接 题意:有n盏灯.编号从1到n.他们绕成一圈,也就是说.1号灯的左边是n号灯.假设在第t秒的时候,某盏灯左边的灯是亮着的,那么就在第t+1秒的时候改变这盏灯 ...
- apache2.4.x三种MPM介绍
三种MPM介绍 Apache 2.X 支持 ...