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

好了,但愿对用获得的朋友,有所帮助。谢谢!
 apache

分享:windows

相关文章
相关标签/搜索