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