天天看點

CMake基本常識

不清楚,為什麼很多越來越多的軟體都用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"