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,不是我们想要的效果。

好了,希望对用得到的朋友,有所帮助。谢谢!

时间: 2024-10-07 12:58:44

cmake总结的相关文章

哪位大兄弟有用 cMake 开发Android ndk的

一直用 Android studio 开发ndk,但是gradle支持的不是很好,只有experimental 版本支持 配置各种蛋疼.主要每次新建一个module都要修改配置半天.之前也看到过google 开发文档有提到 cmake 但是一直没用.哪位大兄弟用过,说下经验 哪位大兄弟有用 cMake 开发Android ndk的 >> android 这个答案描述的挺清楚的:http://www.goodpm.net/postreply/android/1010000007205830/哪位

cmake Debug模式和Release模式

在cmake中要编译debug模式的话,在CMakeLists.txt中添加如下两行 (不写就用默认的值) SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb ") SET(CMAKE_CXX_FLAGS_RELEASE "${ENV{CXXFLAGS} -O3 -Wall") 然后,在编译的时候,使用如下命令: cmake -DCMAKE_BUILD_TYPE=Debug/Release  pa

mcstructs使用CMake生成Makefile文件

CMakeLists.txt project(MCSTRUCTS) set(SRC_LIST src/main.c src/mcslist.c src/mcsringbuf.c) add_executable(mcstructs ${SRC_LIST}) 执行过程: [email protected]:~/projects/mcstructs$ cmake . -- Configuring done -- Generating done -- Build files have been writ

【工具】Cmake与gcc的关系

1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C.C++.Objective-C.Fortran.Java等等). 2.当你的程序只有一个源文件时,直接就可以用gcc命令编译它. 3.但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大 4.所以出现了make工具,make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式-通过调用m

cmake编译安装mysql5.5

CMAKE方式编译安装Mysql5.5 1.源码cmake方式编译安装MySQL5.5.32 安装前先安装: yum install ncurses-devel -y 1.1 下载Mysql和cmake安装包: wget http://wwwNaNake.org/files/v2.8/cmake-2.8.8.tar.gz 1.2 查看系统环境 cat /etc/redhat-release uname -r uname -m 1.3 安装cmake包 tar zxf cmake-2.8.8.ta

windows下使用cmake+mingw配置makefile

前面一节说了cmake简易使用,但是实际开发中项目文件非常多,使用哪种简易方式会导致代码十分混乱,因此本文介绍一种cmake管理大型项目的demo流程. 具体步骤如下: 1.创建相关的项目目录 [cpp] view plain copy cmd mkdir hello cd hello mkdir inlude lib src debug 其中inlucde用来存放头文件,lib用来存放库文件,src用来存放源程序,debug用来作调试,类似于qt等IDE环境的配置 [cpp] view pla

CMAKE 安装

下载 解压  https://cmake.org/download/ https://cmake.org/files/v3.7/cmake-3.7.1.tar.gz yum install gcc -y yum install gcc-c++ -y cd cmake-x.xx ./bootstrap gmake sudo make install

make makefile cmake qmake都是什么,有什么区别

原文:https://www.zhihu.com/question/27455963 作者:玟清链接:https://www.zhihu.com/question/27455963/answer/36722992来源:知乎著作权归作者所有,转载请联系作者获得授权. 1. make 是用来执行Makefile的2. Makefile是类unix环境下(比如Linux)的类似于批处理的"脚本"文件.其基本语法是: 目标+依赖+命令,只有在目标文件不存在,或目标比依赖的文件更旧,命令才会被执

cmake学习

CMake意为cross-platform make,可用于管理c/c++工程.CMake解析配置文件CMakeLists.txt生成Makefile,相比直接用Makefile管理工程,CMake更灵活和简单. 一.cmake的安装及基本语法 (1)安装cmake. 下载地址:http://www.cmake.org/cmake/resources/software.html 有linux和windows版本的. (2)一个实例 CMake Hello World 首先编写一个简单的程序(he

linux CentOS6.6 i386 源码 cmake 编译mysql 5.5

编译安装MySQL-5.5 搜索下载http://down.51cto.com/ 编译安装MySQL前的准备工作 安装编译源码所需的工具和库 [纯净CentOS 6.6 i386] yum install gcc gcc-c++ ncurses-devel perl wget readline-devel zlib-devel openssl-dev cmake [CMAKE] 指定安装文件的安装路径时常用的选项: -DCMAKE_INSTALL_PREFIX=/usr/local/mysql