CMake基本常識

2021-09-23 23:54:11 字數 3338 閱讀 1119

不清楚,為什麼很多越來越多的軟體都用cmake去編譯。cmake就是乙個大奇葩,這麼難用的東西,居然越來越火了!!真心感覺makefile比cmake容易看懂的多。

下面是對cmake一些總結,後續在一點點補充。我們可以通過命令 cmake --help-command *** 檢視離線幫助文件。

一、內建變數

變數含義

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= -d***

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(... [parent_scope])

set(cmake_cxx_flags "-wall std=c++11")

set(source_files main.cpp test.cpp)

value可以有多個

parent_scope:該引數表示影響的變數為父級中變數,本級不影響

這種場景使用最多

cache

set(... cache [force])

建立快取變數,不常用

environment

set(env{} )

修改環境變數的值,注意不影響系統環境環境變數。後續使用,$env{}

如果set只有變數名,沒有value表示取消變數定義,類似unset操作。

2.2 add_definitions函式

add_definitions用於新增編譯引數

舉例說明

add_definitions(...)

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([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"

ORACLE基本常識

個表空間只能屬於乙個資料庫 每個資料庫最少有乙個控制檔案 建議3個,分別放在不同的磁碟上 每個資料庫最少有乙個表空間 system表空間 建立system表空間的目的是盡量將目的相同的表存放在一起,以提高使用效率 每個資料庫最少有兩個聯機日誌檔案 乙個資料檔案只能屬於乙個表空間 乙個資料檔案一旦被加...

電腦基本常識

一.32位cpu中的32代表什麼?1.32代表cpu的位址線長度,32位處理器表示一次只能處理32位 4個位元組 而64位處理器一次能處理64位,即8個位元組的資料。2.如果我們將總長128位的指令分別按照如果我們將總長128位的指令分別按照16位 32位 64位為單位進行編輯的話 舊的16位處理器...

html基本常識

用div布局,css控制 編輯器用的是sublime 1.doctype標籤是一種標準通用標記語言的文件型別宣告,它的目的是要告訴標準通用標記 語言解析器,它應該使用什麼樣的文件型別定義 dtd 來解析文件。作用 宣告文件的解析型別 document.compatmode 避免瀏覽器的怪異模式。do...