不清楚,為什麼很多越來越多的軟體都用CMake去編譯。CMake就是一個大奇葩,這麼難用的東西,居然越來越火了!!真心感覺Makefile比CMake容易看懂的多。
下面是對CMake一些總結,後續在一點點補充。我們可以通過指令 cmake --help-command XXX 檢視離線幫助文檔。
一、内置變量
CMake比較難學主要原因之一是有很多内置變量,在閱讀CMakeLists.txt時遇到:這個變量在哪裡定義的?傻傻分不清楚,這裡把一些常用内置變量羅列出來:
變量 | 含義 |
CMAKE_INSTALL_PREFIX | 指定安裝目錄。一般作為cmake指令行參數 |
CMAKE_SOURCE_DIR | CMakeLists.txt所在目錄 |
CMAKE_CURRENT_SOURCE_DIR | 目前正在處理CMakeLists.txt所在目錄 |
PROJECT_SOURCE_DIR | 代碼根目錄 |
PROJECT_BINARY_DIR | 執行cmake指令所在目錄。一般是建立build目錄并且進入該目錄,執行cmake指令 |
CMAKE_INCLUDE_PATH | 頭檔案所在目錄 |
CMAKE_LIBRARY_PATH | lib庫所在目錄 |
CMAKE_BUIlD_TYPE | 編譯類型,例如Debug、Release。例如-DCMAKE_BUIlD_TYPE=Debug |
CMAKE_C_FLAGS / CMAKE_CXX_FLAGS | 針對C/C++編譯參數,例如:-g -O3 |
CMAKE_CXX_FLAGS_RELEASE | 令人發指的預設參數。參數預設值為-O3 -NDEBUG,有些時候我不需要優化,是以需要關閉。 cmake -DCMAKE_CXX_FLAGS_RELEASE= -DXXX |
CMAKE_C_COMPILER / CMAKE_CXX_COMPILER | 指定c/c++編譯器路徑,例如: set(CMAKE_C_COMPILER "/usr/local/gcc") 或 -DCMAKE_C_COMPILER=/usr/local/gcc |
CMAKE_VERBOSE_MAKEFILE | set(CMAKE_VERBOSE_MAKEFILE ON) 開啟詳細列印 |
二、内置函數
CMake提供了很多内置函數,是以增加了我們學習成本。同樣将常用的内置函數以及用法在這裡進行羅列
2.1 set函數
set用于聲明變量,然後對于CMake來說有三種變量:Normal變量,Cache變量以及環境變量。
類型 | 格式 | 舉例說明 |
Normal | set(<variable> <value>... [PARENT_SCOPE]) | set(CMAKE_CXX_FLAGS "-Wall std=c++11") set(SOURCE_FILES main.cpp test.cpp) value可以有多個 PARENT_SCOPE:該參數表示影響的變量為父級中變量,本級不影響 這種場景使用最多 |
Cache | set(<variable> <value>... CACHE <type> <docstring> [FORCE]) | 建立緩存變量,不常用 |
Environment | set(ENV{<variable>} [<value>]) | 修改環境變量的值,注意不影響系統環境環境變量。後續使用,$ENV{<variable>} |
如果set隻有變量名,沒有value表示取消變量定義,類似unset操作。
2.2 add_definitions函數
add_definitions用于添加編譯參數
舉例說明 | |
add_definitions(<value>...) | add_definitions(-DDEBUG -g -O3) add_definitions( “-Wall -ansi –pedantic –g”) |
但是該函數已經被替換為:
This command has been superseded by alternatives:
* Use ``add_compile_definitions()`` to add preprocessor definitions.
* Use ``include_directories()`` to add include directories.
* Use ``add_compile_options()`` to add other options.
2.3 include_directories / link_directories函數
用于指定頭檔案和庫檔案搜尋目錄,預設添加方式為追加
舉例說明 | |
include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) | link_directories (/home/include /home/cpp/include) 相當于gcc -I AFTER|BERORE 表增加路徑放在原有路徑清單什麼位置,預設以追加方式放在後面 SYSTEM 表示系統目錄 |
link_directories(directory1 directory2 ...) | link_directories (/home/libs /home/cpp/libs) 相當于gcc -L |
2.4 add_library函數
用于建立一個庫檔案
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2 ...]) | add_library(hello STATIC src/hello.c) 表示建立一個libhello.a靜态庫 STATIC -- 靜态庫 SHARED -- 動态庫 MODULE -- 很少用到 EXCLUDE_FROM_ALL -- 很少用到 source1 源檔案,可以包含多個 |
add_library還有其他的形式,可執行cmake --help-command add_library指令進行檢視
三、動态庫
LD_LIBRARY_PATH
LD_PRELOAD
LD_DEBUG
動态庫查找路徑:LD_LIBRARY_PATH,/etc/ld.so.cache,/usr/lib,/lib
可以通過設定LD_LIBRARY_PATH,運作某個可執行檔案,例如:
$ LD_LIBRARY_PATH=/home/user /bin/ls
四、其他
可以在執行configure指令前面增加環境變量
CFLAGS="$CFLAGS -g -O0" ./configure --sysconfdir=/etc --localstatedir=/var --enable-opaque-hierarchy="name=systemd"