cmakelists實操記錄

2021-09-27 14:11:47 字數 4070 閱讀 9723

cmake --help-command

set

(qc_include $ $

/usr/include/amss)

set(qc_include $ $

/usr/include/amss/core)

check environment variables

if ("$env" strequal 「」)

可以將其想象成乙個配置檔案(在unix環境下,我們可以認為它等價於傳遞給configure的引數)。

cmake 第一次執行時將生成 cmakecache.txt 檔案,我們可以通過ccmake或cmake-gui或make edit_cache對其進行編輯。

主要記錄如下途徑得到的變數:

cmakelists.txt 中通過 set(... cache ...) 設定的變數

cmakelists.txt 中的 option() 提供的選項

cmakelists.txt 中find_package() 等find命令引入變數

命令列 cmake . -d := 定義變數

對應於命令列 -d 定義變數,-u 用來刪除變數(支援globbing_expr),比如 cmake -u/qt/ 將刪除所有名字中帶有qt的cache項。

cmake 的變數系統遠比第一眼看上去複雜:

有些變數被cache,有些則不被cache

被cache的變數

有的不能通過ccmake等進行編輯(internal)

有的(帶有描述和型別)可以被編輯(external)

有的只在ccmake的 advanced 模式出現

看個例子:

set(var1 13)

變數 var1 被設定成 13

如果 var1 在cache中已經存在,該命令不會overwrite cache中的值

set(var1 13 ... cache ...)

如果cache存在該變數,使用cache中變數

如果cache中不存在,將該值寫入cache

set(var1 13 ... cache ... force)

不論cache中是否存在,始終使用該值

為了避免每次執行都要進行標頭檔案和庫檔案的探測,以及考慮到允許使用者通過ccmake設定標頭檔案路徑和庫檔案的重要性,這些東西必須進行cache。

find_path 和 find_library 會自動cache他們的變數,如果變數已經存在且是乙個有效值(即不是 -notfound 或 undefined),他們將什麼都不做。

另一方面,模組查詢時輸出的變數(_found,_include_dirs,_libraries)不應該被cache

乙個cmake中開多個project, 連續定義多個工程和引數,編譯多個目標

遞迴查詢檔案, 可以避免醜陋的子目錄塞入cmakelist的問題。

file(... destination [file_permissions ...]

[directory_permissions ...]

[no_source_permissions] [use_source_permissions]

[follow_symlink_chain]

[files_matching]

[[pattern | regex ]

[exclude] [permissions ...]] [...])

copy將檔案,目錄和符號鏈結複製到目標資料夾。相對於當前源目錄評估相對輸入路徑,相對於當前構建目錄評估相對目的地。複製會保留輸入檔案的時間戳,並優化檔案(如果該檔案存在於具有相同時間戳的目標檔案中)。複製將保留輸入許可權,除非給出明確的許可權或no_source_permissions(預設為use_source_permissions)。

如果指定了follow_symlink_chain,則copy將在給定的路徑上遞迴解析符號鏈結,直到找到真實檔案為止,然後在目標位置為遇到的每個符號鏈結安裝相應的符號鏈結。

add_custom_command:

該命令可以為生成的構建系統新增一條自定義的構建規則。這裡又包含兩種使用方式,一種是通過自定義命令在構建中生成輸出檔案,另外一種是向構建目標新增自定義命令。命令格式分別為:

add_custom_command(output output1 [output2 ...]

command command1 [args] [args1...]

[command command2 [args] [args2...] ...]

[main_dependency depend]

[depends [depends...]]

[byproducts [files...]]

[implicit_depends depend1

[depend2] ...]

[working_directory dir]

[comment comment]

[depfile depfile]

[job_pool job_pool]

[command_expand_lists])

下面命令中,target是在本工程中會被執行的目標,可以是 executable, 也可以是 shared library. 需要制定對應的名字。

add_custom_command(target pre_build | pre_link | post_build

command command1 [args] [args1...]

[command command2 [args] [args2...] ...]

[byproducts [files...]]

[working_directory dir]

[comment comment]

[verbatim] [uses_terminal])

add_custom_target(name [all] [command1 [args1...]]

[command command2 [args2...] ...]

[depends depend depend depend ... ]

[byproducts [files...]]

[working_directory dir]

[comment comment]

[job_pool job_pool]

[verbatim] [uses_terminal]

[command_expand_lists]

[sources src1 [src2...]])

為原始檔的編譯新增由-d定義的標誌。

通過如下

cmake --help-commond-list

可以檢視所有的變數

cmake_c_compiler

cmake_c_compiler_target

cmake_cxx_compiler

cmake_cxx_compiler_target

cmake_asm_compiler

cmake_asm_define_flag

cmake_linker

cmake_ar

cmake_nm

cmake_objcopy

cmake_objdump

cmake_ranlib

cmake_strip

cmake_sh

在編譯so的時候,雖然有用到其他so中的介面,但只要有標頭檔案就可以,不需要link so。

cmake -dcmake_build_type=release \

-dcmake_toolchain_file=/path/to/driveworks/samples/cmake/toolchain-v5l.cmake \

-dvibrante_pdk:string=/path/to/drive-t186ref-linux \

/path/to/driveworks/samples/folder

GitLab 實操記錄

目錄 一.gitlab上傳實操 報錯 git master branch has no upstream branch 報錯 failed to push some refs to h 二.精通git 閱讀筆記 提交本地 到遠端倉庫 修改遠端倉庫位址 三.prop 1.通過 babel 和 webp...

XMLPULL解析個人實操記錄

xmlpull解析個人實操記錄 基於android 6.0 準備xml資料文件 訪問位址為電腦本機位址 完成解析某個節點 case xmlpullparser.end tag break default break eventtype xmlpullparser.next catch excepti...

遞迴轉迭代實操記錄

針對那些經典的畫素遊戲設計的自動切圖工具裡用到種子填充演算法的實現。一開始是用遞迴實現的,後來遇到一些頭像之類的比較大一點的圖素,執行的時候經常佔滿c 預設的1m執行緒棧記憶體而崩潰。嘗試使用各種多線方式改造並沒有成功,於是乾脆改成迭代形式,建立乙個stack自己完全精確控制其中的資料操作。這裡擷取...