CMAKE入门
cmake
首先打開頂層目錄CMakeList.txt
1、描述cmake_minimum_required (VERSION 2.x)最低版本要求
2、設置建立工程工程名字 使用 SET 指令,就可以構建一個自定義變量了
3、設置輸出路徑
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
CMAKE_RUNTIME_OUTPUT_DIRECTORY :輸出可執行文件
CMAKE_LIBRARY_OUTPUT_DIRECTORY ?:庫文件一般.so動態庫
CMAKE_ARCHIVE_OUTPUT_DIRECTORY :庫文件 一般靜態庫
4、配置工程文件
? ? ?include(config.cmake)
5、設置目標平臺名字
?? ?set(TARGET_PLATFORM ${DEFAULT_TARGET_PLATFORM})
6、設置編譯類型
?? ?set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type")
7、設置project版本號相關信息
? ?如 :set(project_version "${VESION}.${AND_SO_ON}")
8、set(CMAKE_VERBOSE_MAKEFILE ON)
? ? ? ?顯示詳細的原始編譯信息,主要用于定位一些鏈接錯誤,看看庫路徑什么的是否配置對。
9、根據目標平臺設置不同交叉編譯環境.cmake
10、set_property:在指定域中設置一個命名屬性
? ? ? ?set_property(GLOBAL PROPERTY 目標名字 "")
如下:
? ? ? ?set_property(<GLOBAL??????????????????|
????????????????DIRECTORY [dir]???????????????????|
????????????????TARGET????[target1 [target2 ...]] |
????????????????SOURCE????[src1 [src2 ...]]???????|
????????????????TEST??????[test1 [test2 ...]]?????|
????????????????CACHE?????[entry1 [entry2 ...]]>
????????????????PROPERTY <name>[value1 [value2 ...]])
?? ?在某個域中對零個或多個對象設置一個屬性。第一個參數決定該屬性設置所在的域。它必須為下面中的其中之一:
?? ?GLOBAL域是唯一的,并且不接特殊的任何名字。
?? ?DIRECTORY域默認為當前目錄,但也可以用全路徑或相對路徑指定其他的目錄(前提是該目錄已經被CMake處理)。
?? ?TARGET域可命名零或多個已經存在的目標。
?? ?SOURCE域可命名零或多個源文件。注意:源文件屬性只對在相同目錄下的目標是可見的(CMakeLists.txt)。
?? ?TEST域可命名零或多個已存在的測試。
?? ?CACHE域必須命名零或多個已存在條目的cache.
?? ?PROPERTY后面緊跟著要設置的屬性的名字。
13、include 工程上用到的頭文件
? ? 如:include_directories(${PATH_INCLUDE})
14、在工程全局范圍內定義相關宏
?? ?如:add_definitions(-DMACRO)
15、根據子模塊目錄進行相關操作
? ? 如:add_subdirectory(子目錄名字)
相關cmake操作:
1 、set命令: 將一個CMAKE變量設置為給定值。
? set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
? 將變量<variable>的值設置為<value>。在<variable>被設置之前,<value>會被展開。如果有CACHE選項,那么<variable>就會添加到cache中;這時<type>和<docstring>是必需的。<type>被CMake GUI用來選擇一個窗口,讓用戶設置值。<type>可以是下述值中的一個:
? FILEPATH = 文件選擇對話框。
? PATH ? ? = 路徑選擇對話框。
? STRING ? = 任意的字符串。
? BOOL ? ? = 布爾值選擇復選框。
? INTERNAL = (不需要GUI輸入端,適用于永久保存的變量)。
如果<type>是內部的(INTERNAL),那么<value>總是會被寫入到cache中,并替換任何已經存在于cache中的值。如果它不是一個cache變量,那么這個變量總是會寫入到當前的makefile中。FORCE選項將覆蓋cache值,從而去掉任何用戶帶來的改變。
? 如果指定了PARENT_SCOPE選項,變量<variable>將會被設置為當前作用域之上的作用域中。
? 如果想全局共享某變量3種方法:
? 1、要用set(variable value CACHE INTERNAL docstring )這種方式定義的變量會把變量加入到CMakeCache.txt然后各級目錄共享會訪問到這個變量。
? 2、set(${variable} ${value} PARENT_SCOPE) PARENT_SCOPE ?放到頂層則全局,子目錄可以共享
? 3、set_property(GLOBAL PROPERTY ${variable} "${value}" ) 在其他目錄 ?get_property( GLOBAL PROPERTY ${variable} )?
??
2、CMake可以通過execute_process調用shell命令或者腳本,如下:
? ? execute_process(COMMAND <cmd1> [args1...]]
? ? ? ? ? ? ? ? [COMMAND <cmd2> [args2...] [...]]
? ? ? ? ? ? ? ? [WORKING_DIRECTORY <directory>]
? ? ? ? ? ? ? ? [TIMEOUT <seconds>]
? ? ? ? ? ? ? ? [RESULT_VARIABLE <variable>]
? ? ? ? ? ? ? ? [OUTPUT_VARIABLE <variable>]
? ? ? ? ? ? ? ? [ERROR_VARIABLE <variable>]
? ? ? ? ? ? ? ? [INPUT_FILE <file>]
? ? ? ? ? ? ? ? [OUTPUT_FILE <file>]
? ? ? ? ? ? ? ? [ERROR_FILE <file>]
? ? ? ? ? ? ? ? [OUTPUT_QUIET]
? ? ? ? ? ? ? ? [ERROR_QUIET]
? ? ? ? ? ? ? ? [OUTPUT_STRIP_TRAILING_WHITESPACE]
? ? ? ? ? ? ? ? [ERROR_STRIP_TRAILING_WHITESPACE])
? ? ?調用shell命令:execute_process(COMMAND <shell命令> WORKING_DIRECTORY <此句shell命令執行的工作目錄>)
?? ? 調用腳本:execute_process(COMMAND sh example.sh WORKING_DIRECTORY <example.sh所在目錄>)
3、?? ??
? ? ?add_custom_command :
?? ? add_custom_command(TARGET target
? ? ? ? ? ? ? ? ? ?PRE_BUILD | PRE_LINK | POST_BUILD
? ? ? ? ? ? ? ? ? ?COMMAND command1 [ARGS] [args1...]
? ? ? ? ? ? ? ? ? ?[COMMAND command2 [ARGS] [args2...] ...]
? ? ? ? ? ? ? ? ? ?[WORKING_DIRECTORY dir]
? ? ? ? ? ? ? ? ? ?[COMMENT comment] [VERBATIM])
This defines a new command that will be associated with building the specified target. When the command will happen is determined by which of the following is specified:
PRE_BUILD - run before all other dependencies
PRE_LINK - run after other dependencies
POST_BUILD - run after the target has been built
?? ? 1、增加自定義命令來產生一個輸出
?? ? 2、為某個目標添加一條命令
?? ? 如:add_custom_command(TARGET ${xxx}
?? ? ? ? POST_BUILD|PRE_LINK|PRE_BUILD
?? ? ? ? COMMAND xxxx
? ? ? ? )
4、需要在cmake中創建一些目標,需要通過add_custom_target來指定。add_custom_command可以用來完成對add_custom_target生成的target的補充。
5、add_library?
? ?add_library(libName [STATIC | SHARED | MODULE]
? ? ? ? ? ? [source1] [source2] [...])
? ?libName庫名字,該庫文件會根據命令里列出[source**]源文件。而STATIC、SHARED和MODULE的作用是指定生成的庫文件的類型
?? ?
6、target_link_libraries
? ?該指令的作用為將目標文件與庫文件進行鏈接。
7、link_directories 設置庫鏈接路徑
8、string(CONCAT CMAKE_C_FLAGS ? ? ? ? ${CMAKE_C_FLAGS} ? ? " ****")
? ?string(CONCAT CMAKE_CXX_FLAGS ? ? ? ${CMAKE_CXX_FLAGS} ? "****")
? ?通過上述兩個命令來設置編譯選項CFLAGS CPPFLAGS
9、 LDFLAGS 也可以通過下面四種選項處理
? ?CMAKE_EXE_LINKER_FLAGS:Linker flags to be used to create executables.
? ?CMAKE_MODULE_LINKER_FLAGS:Linker flags to be used to create modules.
? ?CMAKE_SHARED_LINKER_FLAGS:Linker flags to be used to create shared libraries.
? ?CMAKE_STATIC_LINKER_FLAGS:Flags to be used to create static libraries. These flags will be passed to the archiver when creating a static library.
? ?如:通過string(CONCAT CMAKE_EXE_LINKER_FLAGS ?${CMAKE_EXE_LINKER_FLAGS} ?"****"}來設置鏈接選項LDFLAGS?
?
?
相關參考CMake 入門實戰: https://www.hahack.com/codes/cmake/
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: Machine Learning之Pyt
- 下一篇: VIM的复制与粘贴