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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CMakeList常用变量及规则查询笔记

發(fā)布時(shí)間:2023/12/31 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CMakeList常用变量及规则查询笔记 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 1. 常用的變量及規(guī)則
    • ① 預(yù)定義變量
    • ② 系統(tǒng)信息
    • ③ 主要開關(guān)選項(xiàng)
    • ④ 環(huán)境變量
    • ⑤ 常用規(guī)則
  • 2. 項(xiàng)目組織結(jié)構(gòu)
  • 3. 自定義搜索規(guī)則
  • 4. 條件控制
    • if…elseif…else…endif
    • while…endwhile
    • foreach…endforeach
  • 5. 打印信息
  • 6. 包含其他cmake文件

1. 常用的變量及規(guī)則

① 預(yù)定義變量

  • PROJECT_NAME:項(xiàng)目名稱
  • PROJECT_SOURCE_DIR:工程的根目錄
  • PROJECT_BINARY_DIR :執(zhí)行cmake命令的目錄,通常是 ${PROJECT_SOURCE_DIR}/build
  • CMAKE_CURRENT_SOURCE_DIR:當(dāng)前CMakeLists.txt文件所在目錄
  • CMAKE_CURRENT_BINARY_DIR:target 編譯目錄
  • CMAKE_CURRENT_LIST_DIR:CMakeLists.txt 的完整路徑
  • CMAKE_CURRENT_LIST_LINE:當(dāng)前所在的行
  • CMAKE_INSTALL_PREFIX:工程安裝目錄,所有生成和調(diào)用所需的可執(zhí)行程序,庫(kù)文件,頭文件都會(huì)安裝到該路徑下,Unix/Linux下默認(rèn)為/usr/local,windows下默認(rèn)為C:\Program Files
  • CMAKE_MODULE_PATH:設(shè)置搜索CMakeModules模塊(.cmake)的額外路徑,用來定義自己的 cmake 模塊所在的路徑,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令來調(diào)用自己的模塊
  • CMAKE_C_FLAGS:設(shè)置C編譯選項(xiàng)
  • CMAKE_CXX_FLAGS:設(shè)置C++編譯選項(xiàng)
  • CMAKE_C_COMPILER:設(shè)置C編譯器
  • CMAKE_CXX_COMPILER:設(shè)置C++編譯器
  • CMAKE_BUILD_TYPE:build類型(Debug,Release,…),CMAKE_BUILD_TYPE=Debug;
  • CMAKE_COMMAND:也就是CMake可執(zhí)行文件本身的全路徑
  • CMAKE_DEBUG_POSTFIX:Debug版本生成目標(biāo)的后綴,通常可以設(shè)置為"d"字符
  • CMAKE_GENERATOR:編譯器名稱,例如”UnixMakefiles”, “Visual Studio 7”等
  • BUILD_SHARED_LIBS:指定編譯成靜態(tài)庫(kù)還是動(dòng)態(tài)庫(kù)
  • EXECUTABLE_OUTPUT_PATH:設(shè)置編譯后可執(zhí)行文件目錄
  • LIBRARY_OUTPUT_PATH:設(shè)置生成的庫(kù)文件目錄
  • CMAKE_INCLUDE_CURRENT_DIR:自動(dòng)添加CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到當(dāng)前處理的CMakeLists.txt,set (CMAKE_INCLUDE_CURRENT_DIR ON)

② 系統(tǒng)信息

  • CMAKE_MAJOR_VERSION:cmake 主版本號(hào),比如 3.4.1 中的 3
  • CMAKE_MINOR_VERSION:cmake 次版本號(hào),比如 3.4.1 中的 4
  • CMAKE_PATCH_VERSION:cmake 補(bǔ)丁等級(jí),比如 3.4.1 中的 1
  • CMAKE_SYSTEM:系統(tǒng)名稱,比如 Linux-2.6.22
  • CMAKE_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:這個(gè)開關(guān)用來控制默認(rèn)的庫(kù)編譯方式,如果不進(jìn)行設(shè)置,使用 add_library 又沒有指定庫(kù)類型的情況下,默認(rèn)編譯生成的庫(kù)都是靜態(tài)庫(kù)。如果 set(BUILD_SHARED_LIBS ON)后,默認(rèn)生成的為動(dòng)態(tài)庫(kù)
  • CMAKE_C_FLAGS:設(shè)置 C 編譯選項(xiàng),也可以通過指令 add_definitions() 添加
  • CMAKE_CXX_FLAGS:設(shè)置 C++ 編譯選項(xiàng),也可以通過指令 add_definitions() 添加
add_definitions(-DENABLE_DEBUG -DABC) # 參數(shù)之間用空格分隔

④ 環(huán)境變量

# 使用環(huán)境變量$ENV{Name}# 寫入環(huán)境變量set(ENV{Name} value) # 這里沒有“$”符號(hào)

⑤ 常用規(guī)則

  • cmake_minimum_required(VERSION 3.16) :指令cmake 版本

  • project(hello_world) :設(shè)置工程名

  • include_directories(${PROJECT_SOURCE_DIR}/include) :添加頭文件路徑

  • link_directories(${PROJECT_SOURCE_DIR}/lib) :添加鏈接庫(kù)的路徑

  • add_subdirectory(module):添加 module 子目錄, 此目錄下也要有CMakeLists.txt文件

  • add_executable(project1 main.c):指定編譯的可執(zhí)行文件

  • add_library(lib1 SHARED library.c library.h):指定生成的庫(kù)文件,SHARED為生成動(dòng)態(tài)庫(kù),STATIC為生成靜態(tài)庫(kù)

  • add_compile_options(): 添加編譯選項(xiàng),如add_compile_options(-std=c++11 -Wall)

  • target_link_libraries():將目標(biāo)文件與庫(kù)文件進(jìn)行鏈接

  • install():指定make install的目錄

  • set(XXXX YYYYYY):用于設(shè)置和修改變量,例如

    set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib) set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)set( SRC_LIST./main.c./testFunc1.c./testFunc.c)# 設(shè)置追加變量 set(SRC_LIST main.cpp) set(SRC_LIST ${SRC_LIST} test.cpp) add_executable(demo ${SRC_LIST})
  • ${XXXX} :使用變量

  • list():追加或刪除變量的值

    set(SRC_LIST main.cpp) list(APPEND SRC_LIST test.cpp) list(REMOVE_ITEM SRC_LIST main.cpp) add_executable(demo ${SRC_LIST})
  • find_library: 在指定目錄下查找指定庫(kù),并把庫(kù)的絕對(duì)路徑存放到變量里,其第一個(gè)參數(shù)是變量名稱,第二個(gè)參數(shù)是庫(kù)名稱,第三個(gè)參數(shù)是HINTS,第4個(gè)參數(shù)是路徑,其它用法可以參考cmake文檔,類似的還有 find_file()、find_path()、find_program()、find_package()等命令。

    find_library(VAR lib_name path )

2. 項(xiàng)目組織結(jié)構(gòu)

  • bin
  • build
  • include
  • src
  • lib

3. 自定義搜索規(guī)則

file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp") add_library(demo ${SRC_LIST})#或者 file(GLOB SRC_LIST "*.cpp") file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp") add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})#或者 aux_source_directory(. SRC_LIST) aux_source_directory(protocol SRC_PROTOCOL_LIST) add_library(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})

4. 條件控制

if…elseif…else…endif

邏輯判斷和比較:

  • if (expression):expression 不為空(0,N,NO,OFF,FALSE,NOTFOUND)時(shí)為真
  • 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):給定的變量或者字符串能夠匹配正則表達(dá)式 regex 時(shí)為真,此處 var 可以用 var 名,也可以用 ${var}
  • if (string MATCHES regex)

數(shù)字比較:

  • if (variable LESS number):LESS 小于
  • if (string LESS number)
  • if (variable GREATER number):GREATER 大于
  • if (string GREATER number)
  • if (variable EQUAL number):EQUAL 等于
  • if (string EQUAL number)

字母表順序比較:

  • if (variable STRLESS string)
  • if (string STRLESS string)
  • if (variable STRGREATER string)
  • if (string STRGREATER string)
  • if (variable STREQUAL string)
  • if (string STREQUAL string)
if(MSVC)set(LINK_LIBS common) else()set(boost_thread boost_log.a boost_system.a) endif() target_link_libraries(demo ${LINK_LIBS})#或者 if(UNIX)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fpermissive -g") else()add_definitions(-D_SCL_SECURE_NO_WARNINGSD_CRT_SECURE_NO_WARNINGS-D_WIN32_WINNT=0x601-D_WINSOCK_DEPRECATED_NO_WARNINGS) endif()if(${CMAKE_BUILD_TYPE} MATCHES "debug")... else()... endif()

while…endwhile

while(condition)... endwhile()

foreach…endforeach

foreach(loop_var RANGE start stop [step])... endforeach(loop_var)

start 表示起始數(shù),stop 表示終止數(shù),step 表示步長(zhǎng),示例:

foreach(i RANGE 1 9 2)message(${i}) endforeach(i) #輸出:13579

5. 打印信息

message(${PROJECT_SOURCE_DIR}) message("build with debug mode") message(WARNING "this is warnning message") message(FATAL_ERROR "this build has many error") # FATAL_ERROR 會(huì)導(dǎo)致編譯失敗

6. 包含其他cmake文件

include(./common.cmake) # 指定包含文件的全路徑 include(def) # 在搜索路徑中搜索def.cmake文件 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) # 設(shè)置include的搜索路徑#################################################################CMakeLists.txt cmake_minimum_required(VERSION 2.8) include (Project.txt)#Project.txt project (Project) add_executable(Project project.c)

參考文獻(xiàn):

  • https://www.jianshu.com/p/2b6cbf53ba95
  • https://blog.csdn.net/afei__/article/details/81201039
  • https://blog.csdn.net/whahu1989/article/details/82078563
  • https://www.jb51.cc/c/110763.html
  • blog.csdn.net/fengbingchun/article/details/46685413

總結(jié)

以上是生活随笔為你收集整理的CMakeList常用变量及规则查询笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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