日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cmake使用示例与整理总结

發(fā)布時(shí)間:2024/2/28 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cmake使用示例与整理总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

cmake中一些預(yù)定義變量

  • PROJECT_SOURCE_DIR 工程的根目錄
  • PROJECT_BINARY_DIR 運(yùn)行cmake命令的目錄,通常是${PROJECT_SOURCE_DIR}/build
  • CMAKE_INCLUDE_PATH 環(huán)境變量,非cmake變量
  • CMAKE_LIBRARY_PATH 環(huán)境變量
  • CMAKE_CURRENT_SOURCE_DIR 當(dāng)前處理的CMakeLists.txt所在的路徑
  • CMAKE_CURRENT_BINARY_DIR target編譯目錄
    使用ADD_SURDIRECTORY(src bin)可以更改此變量的值
    SET(EXECUTABLE_OUTPUT_PATH <新路徑>)并不會(huì)對(duì)此變量有影響,只是改變了最終目標(biāo)文件的存儲(chǔ)路徑
  • CMAKE_CURRENT_LIST_FILE 輸出調(diào)用這個(gè)變量的CMakeLists.txt的完整路徑
  • CMAKE_CURRENT_LIST_LINE 輸出這個(gè)變量所在的行
  • CMAKE_MODULE_PATH 定義自己的cmake模塊所在的路徑
    SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令來調(diào)用自己的模塊
  • EXECUTABLE_OUTPUT_PATH 重新定義目標(biāo)二進(jìn)制可執(zhí)行文件的存放位置
  • LIBRARY_OUTPUT_PATH 重新定義目標(biāo)鏈接庫文件的存放位置
  • PROJECT_NAME 返回通過PROJECT指令定義的項(xiàng)目名稱
  • CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 用來控制IF ELSE語句的書寫方式

系統(tǒng)信息

  • CMAKE_MAJOR_VERSION cmake主版本號(hào),如2.8.6中的2
  • CMAKE_MINOR_VERSION cmake次版本號(hào),如2.8.6中的8
  • CMAKE_PATCH_VERSION cmake補(bǔ)丁等級(jí),如2.8.6中的6
  • CMAKE_SYSTEM 系統(tǒng)名稱,例如Linux-2.6.22
  • CAMKE_SYSTEM_NAME 不包含版本的系統(tǒng)名,如Linux
  • CMAKE_SYSTEM_VERSION 系統(tǒng)版本,如2.6.22
  • CMAKE_SYSTEM_PROCESSOR 處理器名稱,如i686
  • UNIX 在所有的類UNIX平臺(tái)為TRUE,包括OS X和cygwin
  • WIN32 在所有的win32平臺(tái)為TRUE,包括cygwin

開關(guān)選項(xiàng)

  • BUILD_SHARED_LIBS 控制默認(rèn)的庫編譯方式。如果未進(jìn)行設(shè)置,使用ADD_LIBRARY時(shí)又沒有指定庫類型,默認(rèn)編譯生成的庫都是靜態(tài)庫 (可在t3中稍加修改進(jìn)行驗(yàn)證)
  • CMAKE_C_FLAGS 設(shè)置C編譯選項(xiàng)
  • CMAKE_CXX_FLAGS 設(shè)置C++編譯選項(xiàng)

cmake常用命令

基本語法規(guī)則:
  • cmake變量使用${}方式取值,但是在IF控制語句中是直接使用變量名
  • 環(huán)境變量使用$ENV{}方式取值,使用SET(ENV{VAR} VALUE)賦值
  • 指令(參數(shù)1 參數(shù)2…)
    參數(shù)使用括弧括起,參數(shù)之間使用空格或分號(hào)分開。

    以ADD_EXECUTABLE指令為例: ADD_EXECUTABLE(hello main.c func.c)或者 ADD_EXECUTABLE(hello main.c;func.c)
  • 指令是大小寫無關(guān)的,參數(shù)和變量是大小寫相關(guān)的。推薦你全部使用大寫指令。

部分常用命令列表:
  • PROJECT
    PROJECT(projectname [CXX] [C] [Java])
    指定工程名稱,并可指定工程支持的語言。支持語言列表可忽略,默認(rèn)支持所有語言
  • SET
    SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
    定義變量(可以定義多個(gè)VALUE,如SET(SRC_LIST main.c util.c reactor.c))
  • MESSAGE
    MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” …)
    向終端輸出用戶定義的信息或變量的值
    SEND_ERROR, 產(chǎn)生錯(cuò)誤,生成過程被跳過
    STATUS, 輸出前綴為—的信息
    FATAL_ERROR, 立即終止所有cmake過程
  • ADD_EXECUTABLE
    ADD_EXECUTABLE(bin_file_name ${SRC_LIST})
    生成可執(zhí)行文件
  • ADD_LIBRARY
    ADD_LIBRARY(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] SRC_LIST)
    生成動(dòng)態(tài)庫或靜態(tài)庫
    SHARED 動(dòng)態(tài)庫
    STATIC 靜態(tài)庫
    MODULE 在使用dyld的系統(tǒng)有效,若不支持dyld,等同于SHARED
    EXCLUDE_FROM_ALL 表示該庫不會(huì)被默認(rèn)構(gòu)建
  • SET_TARGET_PROPERTIES
    設(shè)置輸出的名稱,設(shè)置動(dòng)態(tài)庫的版本和API版本
  • CMAKE_MINIMUM_REQUIRED
    CMAKE_MINIMUM_REQUIRED(VERSION version_number [FATAL_ERROR])
    聲明CMake的版本要求
  • ADD_SUBDIRECTORY
    ADD_SUBDIRECTORY(src_dir [binary_dir] [EXCLUDE_FROM_ALL])
    向當(dāng)前工程添加存放源文件的子目錄,并可以指定中間二進(jìn)制和目標(biāo)二進(jìn)制的存放位置
    EXCLUDE_FROM_ALL含義:將這個(gè)目錄從編譯過程中排除
  • SUBDIRS
    deprecated,不再推薦使用
    (hello sample)相當(dāng)于分別寫ADD_SUBDIRECTORY(hello),ADD_SUBDIRECTORY(sample)
  • INCLUDE_DIRECTORIES
    INCLUDE_DIRECTORIES([AFTER | BEFORE] [SYSTEM] dir1 dir2 … )
    向工程添加多個(gè)特定的頭文件搜索路徑,路徑之間用空格分隔,如果路徑包含空格,可以使用雙引號(hào)將它括起來,默認(rèn)的行為為追加到當(dāng)前頭文件搜索路徑的后面。有如下兩種方式可以控制搜索路徑添加的位置:
    • CMAKE_INCLUDE_DIRECTORIES_BEFORE,通過SET這個(gè)cmake變量為on,可以將添加的頭文件搜索路徑放在已有路徑的前面
    • 通過AFTER或BEFORE參數(shù),也可以控制是追加還是置前
  • LINK_DIRECTORIES
    LINK_DIRECTORIES(dir1 dir2 …)
    添加非標(biāo)準(zhǔn)的共享庫搜索路徑
  • TARGET_LINK_LIBRARIES
    TARGET_LINK_LIBRARIES(target lib1 lib2 …)
    為target添加需要鏈接的共享庫
  • ADD_DEFINITIONS
    向C/C++編譯器添加-D定義
    ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),參數(shù)之間用空格分隔
  • ADD_DEPENDENCIES
    ADD_DEPENDENCIES(target-name depend-target1 depend-target2 …)
    定義target依賴的其他target,確保target在構(gòu)建之前,其依賴的target已經(jīng)構(gòu)建完畢
  • AUX_SOURCE_DIRECTORY
    AUX_SOURCE_DIRECTORY(dir VAR)
    發(fā)現(xiàn)一個(gè)目錄下所有的源代碼文件并將列表存儲(chǔ)在一個(gè)變量中
    把當(dāng)前目錄下的所有源碼文件名賦給變量DIR_HELLO_SRCS
  • EXEC_PROGRAM
    EXEC_PROGRAM(Executable [dir where to run] [ARGS <args>][OUTPUT_VARIABLE <var>] [RETURN_VALUE <value>])
    用于在指定目錄運(yùn)行某個(gè)程序(默認(rèn)為當(dāng)前CMakeLists.txt所在目錄),通過ARGS添加參數(shù),通過OUTPUT_VARIABLE和RETURN_VALUE獲取輸出和返回值,如下示例

    # 在src中運(yùn)行l(wèi)s命令,在src/CMakeLists.txt添加 EXEC_PROGRAM(ls ARGS "*.c" OUTPUT_VARIABLE LS_OUTPUT RETURN_VALUE LS_RVALUE) IF (not LS_RVALUE)MESSAGE(STATUS "ls result: " ${LS_OUTPUT}) # 縮進(jìn)僅為美觀,語法無要求 ENDIF(not LS_RVALUE)
  • INCLUDE
    INCLUDE(file [OPTIONAL]) 用來載入CMakeLists.txt文件
    INCLUDE(module [OPTIONAL])用來載入預(yù)定義的cmake模塊
    OPTIONAL參數(shù)的左右是文件不存在也不會(huì)產(chǎn)生錯(cuò)誤
    可以載入一個(gè)文件,也可以載入預(yù)定義模塊(模塊會(huì)在CMAKE_MODULE_PATH指定的路徑進(jìn)行搜索)
    載入的內(nèi)容將在處理到INCLUDE語句時(shí)直接執(zhí)行

  • FIND_

    • FIND_FILE(<VAR> name path1 path2 …)
      VAR變量代表找到的文件全路徑,包含文件名
    • FIND_LIBRARY(<VAR> name path1 path2 …)
      VAR變量代表找到的庫全路徑,包含庫文件名

      FIND_LIBRARY(libX X11 /usr/lib) IF (NOT libx)MESSAGE(FATAL_ERROR "libX not found") ENDIF(NOT libX)
    • FIND_PATH(<VAR> name path1 path2 …)
      VAR變量代表包含這個(gè)文件的路徑

    • FIND_PROGRAM(<VAR> name path1 path2 …)
      VAR變量代表包含這個(gè)程序的全路徑
    • FIND_PACKAGE(<name> [major.minor] [QUIET] [NO_MODULE] [[REQUIRED | COMPONENTS] [componets …]])
      用來調(diào)用預(yù)定義在CMAKE_MODULE_PATH下的Find<name>.cmake模塊,你也可以自己定義Find<name>
      模塊,通過SET(CMAKE_MODULE_PATH dir)將其放入工程的某個(gè)目錄供工程使用
  • IF
    語法:

    IF (expression)COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ELSE (expression)COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ENDIF (expression) # 一定要有ENDIF與IF對(duì)應(yīng)

    IF (expression), expression不為:空,0,N,NO,OFF,FALSE,NOTFOUND或<var>_NOTFOUND,為真
    IF (not exp), 與上面相反
    IF (var1 AND var2)
    IF (var1 OR var2)
    IF (COMMAND cmd) 如果cmd確實(shí)是命令并可調(diào)用,為真
    IF (EXISTS dir) IF (EXISTS file) 如果目錄或文件存在,為真
    IF (file1 IS_NEWER_THAN file2),當(dāng)file1比file2新,或file1/file2中有一個(gè)不存在時(shí)為真,文件名需使用全路徑
    IF (IS_DIRECTORY dir) 當(dāng)dir是目錄時(shí),為真
    IF (DEFINED var) 如果變量被定義,為真
    IF (var MATCHES regex) 此處var可以用var名,也可以用${var}
    IF (string MATCHES regex)

    當(dāng)給定的變量或者字符串能夠匹配正則表達(dá)式regex時(shí)為真。比如: IF ("hello" MATCHES "ell")MESSAGE("true") ENDIF ("hello" MATCHES "ell")

    數(shù)字比較表達(dá)式
    IF (variable LESS number)
    IF (string LESS number)
    IF (variable GREATER number)
    IF (string GREATER number)
    IF (variable EQUAL number)
    IF (string EQUAL number)

    按照字母表順序進(jìn)行比較
    IF (variable STRLESS string)
    IF (string STRLESS string)
    IF (variable STRGREATER string)
    IF (string STRGREATER string)
    IF (variable STREQUAL string)
    IF (string STREQUAL string)

    一個(gè)小例子,用來判斷平臺(tái)差異: IF (WIN32)MESSAGE(STATUS “This is windows.”) ELSE (WIN32)MESSAGE(STATUS “This is not windows”) ENDIF (WIN32) 上述代碼用來控制在不同的平臺(tái)進(jìn)行不同的控制,但是,閱讀起來卻并不是那么舒服,ELSE(WIN32)之類的語句很容易引起歧義。 可以SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) 這時(shí)候就可以寫成: IF (WIN32) ELSE () ENDIF () 配合ELSEIF使用,可能的寫法是這樣: IF (WIN32)#do something related to WIN32 ELSEIF (UNIX)#do something related to UNIX ELSEIF(APPLE)#do something related to APPLE ENDIF (WIN32)
  • WHILE
    語法:

    WHILE(condition)COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ENDWHILE(condition)

    其真假判斷條件可以參考IF指令

  • FOREACH
    FOREACH指令的使用方法有三種形式:
  • 列表
    語法: FOREACH(loop_var arg1 arg2 ...)COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ENDFOREACH(loop_var) 示例: AUX_SOURCE_DIRECTORY(. SRC_LIST) FOREACH(F ${SRC_LIST})MESSAGE(${F}) ENDFOREACH(F)
  • 范圍
    語法: FOREACH(loop_var RANGE total)COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ENDFOREACH(loop_var) 示例: 從0到total以1為步進(jìn) FOREACH(VAR RANGE 10)MESSAGE(${VAR}) ENDFOREACH(VAR) 輸出: 012345678910
  • 范圍和步進(jìn)
    語法: FOREACH(loop_var RANGE start stop [step])COMMAND1(ARGS ...)COMMAND2(ARGS ...)... ENDFOREACH(loop_var) 從start開始到stop結(jié)束,以step為步進(jìn),
    注意:直到遇到ENDFOREACH指令,整個(gè)語句塊才會(huì)得到真正的執(zhí)行。 FOREACH(A RANGE 5 15 3)MESSAGE(${A}) ENDFOREACH(A) 輸出: 581114

cmake中如何生成動(dòng)態(tài)庫和靜態(tài)庫

參考ADD_LIBRARY和SET_TARGET_PROPERTIES用法
t3示例

cmake中如何使用動(dòng)態(tài)庫和靜態(tài)庫(查找?guī)斓穆窂?#xff09;

參考INCLUDE_DIRECTORIES, LINK_DIRECTORIES, TARGET_LINK_LIBRARIES用法
t4示例使用動(dòng)態(tài)庫或靜態(tài)庫
t5示例如何使用cmake預(yù)定義的cmake模塊(以FindCURL.cmake為例演示)
t6示例如何使用自定義的cmake模塊(編寫了自定義的FindHELLO.cmake)
注意讀t5和t6的CMakeLists.txt和FindHELLO.cmake中的注釋部分

cmake中如何指定生成文件的輸出路徑

  • 如上ADD_SUBDIRECTORY的時(shí)候指定目標(biāo)二進(jìn)制文件輸出路徑(推薦使用下面這種)
  • 使用SET命令重新定義EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH變量來指定最終的二進(jìn)制文件的位置 SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 上面的兩條命令通常緊跟ADD_EXECUTABLE和ADD_LIBRARY,與其寫在同一個(gè)CMakeLists.txt即可

cmake中如何增加編譯選項(xiàng)

使用變量CMAKE_C_FLAGS添加C編譯選項(xiàng)
使用變量CMAKE_CXX_FLAGS添加C++編譯選項(xiàng)
使用ADD_DEFINITION添加

cmake中如何增加頭文件路徑

參考INCLUDE_DIRECTORIES命令用法

cmake中如何在屏幕上打印信息

參考MESSAGE用法

cmake中如何給變量賦值

參考SET和AUX_SOURCE_DIRECTORY用法

建議:在Project根目錄先建立build,然后在build文件夾內(nèi)運(yùn)行cmake ..,這樣就不會(huì)污染源代碼, 如果不想要這些自動(dòng)生成的文件了,只要簡單的刪除build文件夾就可以

總結(jié)

以上是生活随笔為你收集整理的cmake使用示例与整理总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。