CMake

CMake是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。他能夠輸出各種各樣的makefile或者project文件,能測試編譯器所支持的C++特性,類似UNIX下的automake。

CMake 使用方法


CMake的所有的語句都寫在一個叫:CMakeLists.txt 的文件中。當CMakeLists.txt文件確定后,可以用ccmake命令對相關 的變量值進行配置。這個命令必須指向CMakeLists.txt所在的目錄。配置完成之后,應用cmake命令生成相應的makefile(在Unix like系統下)或者 project文件(指定用window下的相應編程工具編譯時)。需要為任何子目錄建立一個CMakeLists.txt

其基本操作流程為:

ccmake directory
cmake directory
cmake -DCMAKE_BUILD_TYPE=Debug/Release directory
make

其中,directory為CMakeLists.txt所在目錄,Makefile等文件的生成目錄為cmake執行目錄:

  • 第一條語句用于配置編譯選項,如VTK_DIR目錄,一般這一步不需要配置,直接執行第二條語句即可,但當出現錯誤時,這里就需要認為配置了,這一步才真正派上用場;
  • 第二條命令用于根據CMakeLists.txt生成Makefile文件;
  • 三條命令用于執行Makefile文件,編譯程序,生成可執行文件。

注:為了方便描述,下面的文件目錄按照以下規則:

工程頂層目錄:/cmake
in source編譯下:工程編譯發生目錄為/cmake
out of source編譯下:工程編譯目錄為/cmake/build
源文件所在目錄為:/cmake/src
二進制文件目錄:/cmake/build/bin

Cmake目錄規則


|----build/builds
|     |----cmake
|     |----mingw32
|     |----msvc
|     |----redhat
|     |----valgrind
|     |----zos
|----common
|----config
|----debug
|----doc
|----include
|----release
|----src
|----tests
|----tools
|----utils
|--- AUTHORS
|--- autogen.bat/sh
|--- CMakeLists.txt
|--- COPYING
|--- INSTALL
|--- MAINTAINERS
|--- NEWS
|--- README.md

CMake常用變量和環境變量


工程頂層目錄/cmake

CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR

// 以下環境變量在in source編譯情況下為工程頂層目錄
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR 

工程構建目錄/cmake/build

//out of source編譯情況下
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
<projectname>_BINARY_DIR

與當前Cmake或二進制相關

CMAKE_CURRENT_SOURCE_DIR //當前處理的 CMakeLists.txt 所在的路徑。例如源文件所在目錄/cmake/src

//如果是in source編譯,就是工程頂層目錄/cmake
//如果是out of source編譯,就是target編譯目錄(/cmake/build/bin),可以使用ADD_SUBDIRECTORY(src bin)來更改這個值。
CMAKE_CURRRENT_BINARY_DIR

輸出相關

EXECUTABLE_OUTPUT_PATH
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

LIBRARY_OUTPUT_PATH
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
  • EXECUTABLE_OUTPUT_PATH表示最終的目標二進制的位置;
  • LIBRARY_OUTPUT_PATH表示最終的共享庫。
  • 在哪里ADD_EXECUTABLE或ADD_LIBRARY,如果需要改變目標存放路徑,就在哪里加入上述的定義。

PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR

PROJECT_SOURCE_DIR為工程所在目錄;PROJECT_BINARY_DIR為編譯發生的當前目錄,也就是make的執行目錄。

CMake指令


CMAKE_MINIMUM_REQUIRED

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

option指令

PROJECT指令

PROJECT(projectname [CXX] [C] [Java])
示例:PROJECT (HELLO CXX)

用來定義工程名稱,并可指定工程支持的語言,支持的語言列表是可以忽略的,默認情況表示支持所有語言。

這個指令隱式的定義了兩個cmake變量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR。cmake系統也幫助我們預定義了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR變量,他們的值分別跟 <projectname>_BINARY_DIR與 <projectname>_SOURCE_DIR 一致。建議使用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR。

SET指令

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
示例:SET(SRC_LIST main.cpp t1.cpp t2.cpp)

MESSAGE指令

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"...)
示例:MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

用于向終端輸出用戶定義的信息,包含三種類型:

  • SEND_ERROR,產生錯誤,生成過程被跳過。
  • SATUS,輸出前綴為—的信息。
  • FATAL_ERROR,立即終止所有 cmake 過程.。

ADD_EXECUTABLE指令

ADD_EXECUTABLE(demo ${SRC_LIST})
ADD_EXECUTABLE(demo main.cpp t1.cpp t2.cpp)

定義了這個工程會生成一個名為demo的可執行文件,相關的源文件是SRC_LIST中定義的源文件列表。

ADD_LIBRARY指令

ADD_LIBRARY(libname [SHARED|STATIC|MODULE][EXCLUDE_FROM_ALL] source1 source2 ... sourceN)
  • SHARED:動態庫
  • STATIC:靜態庫
  • MODULE:在使用dyld的系統有效,如果不支持dyld,則被當做SHARED對待
  • EXCLUDE_FROM_ALL 參數的意思是這個庫不會被默認構建,除非有其他的組件依賴或者手工構建。

SET_TARGET_PROPERTIES指令

SET_TARGET_PROPERTIES(target1 target2 ...PROPERTIES prop1 value1prop2 value2 ...)

用來設置輸出的名稱,對于動態庫,還可以用來指定動態庫版本和 API 版本。

INSTALL指令

INSTALL(TARGETS myrun mylib mystaticlib
     RUNTIME DESTINATION bin
     LIBRARY DESTINATION lib
     ARCHIVE DESTINATION libstatic
)
  • 可執行二進制myrun安裝到${CMAKE_INSTALL_PREFIX}/bin目錄
  • 動態庫libmylib安裝到${CMAKE_INSTALL_PREFIX}/lib目錄
  • 靜態庫libmystaticlib安裝到${CMAKE_INSTALL_PREFIX}/libstatic目錄

CMake使用


自定義Makefile目標

運行下面的代碼,會先創建一個./debug目錄,然后拷貝file.dll到./debug目錄。

add_custom_command(
    OUTPUT ./debug/file.dll
    COMMAND mkdir -p ./debug
            cp ./file.dll ./debug
    DEPENDS ./file.dll
)
add_custom_target(dlltest DEPENDS ./debug/file.dll)

add_executable(demo ${SRC_LIST})
add_dependencies(demo dlltest )

歡迎訪問我的個人博客click me

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 注:首發地址 1. 前言 當在做 Android NDK 開發時,如果不熟悉用 CMake 來構建,讀不懂 CMa...
    cfanr閱讀 24,562評論 1 53
  • CMake學習 本篇分享一下有關CMake的一些學習心得以及相關使用。 本文目錄如下: [1、CMake介紹] [...
    AlphaGL閱讀 12,292評論 11 79
  • CMake學習 參考自《Cmake Practice --Cjacker》 基本語法規則 變量的引用 變量使用${...
    techping閱讀 2,138評論 0 6
  • 可以設置的變量 使用方式cmake -DCMAKE_INSTALL_PREFIX=yourpath 或在CMAKE...
    趙海洋閱讀 1,421評論 0 3
  • 么文與占
    取個名好藍閱讀 157評論 0 0