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

相關文章
相關標籤/搜索