<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      CMAKE的學習

      下面我們來介紹Cmake

      Cmake

      我們著重介紹一下CMAKE,是因為CMAKE現在用的人比MAKEFILE多一些,也更好理解,編寫一些。

      1 安裝 cmake

      1.1 卸載已經安裝的舊版的CMAKE【非必需】

      apt-get autoremove cmake
      

      1.2 文件下載解壓:

      wget https://github.com/Kitware/CMake/releases/download/v3.24.2/cmake-3.24.2-linux-x86_64.tar.gz
      

      解壓:

       tar zxvf cmake-3.24.2-linux-x86_64.tar.gz
      

      查看解壓后目錄:

      tree -L 2 cmake-3.24.2-linux-x86_64
      

      1.3 創建軟鏈接

      注:文件路徑是可以指定的,一般選擇/opt/user路徑下,這里選擇/opt

      mv cmake-3.24.2-linux-x86_64 /opt/cmake-3.24.2
      ln -sf /opt/cmake-3.24.2/bin/* /usr/bin
      

      2 基本exe項目的編譯

      2.1 基本工程

      first_cmake.cpp

      #include<iostream>
      
      int main(int argc ,char* argv[])
      {
          std::cout<<"my first CmakeProject";
          return 0;
      }
      

      CMakeLists.txt

      
      #單個目錄實現
      #CMAKE最低版本號要求
      cmake_minimum_required(VERSION 2.8)
      #工程名
      PROJECT(GodDragon)
      #手動加入文件
      SET(SRC_LIST main.c)
      MESSAGE(STATUS "THIS IS BINARY DIR"${PROJECT_BINARY_DIR})
      MESSAGE(STATUS "THIS IS SOURCE DIR"${PROJECT_SOURCE_DIR})
      ADD_EXECUTABLE(0voice ${SRC_LIST})
      

      我們現在WINDOWS平臺下,使用CMAKE編譯一下我們的工程。

      現在看看我們生成的文件是什么樣的。

      這樣我們第一個cmake WINDOWS項目就這樣完成了

      我們現在linux平臺下,使用CMAKE編譯一下我們的工程。

      我們可以看到我們生成了我們第一個linux項目。

      3.編譯動態庫和靜態庫

      編譯靜態庫

      xlog.h

      //xlog.h
      #ifndef XLOG_H
      #define XLOG_H
      class XLog
      {
      	public:
      		XLog();
      };
      #endif
      
      

      xlog.cpp

      #include"xlog.h"
      #include<iostream>
      XLog::XLog()
      {
      	std::cout<<"XLog()"<<std::endl;
      }
      
      

      CMakeLists.txt

      cmake_minimum_required(VERSION 3.20)
      project(xlog)
      add_library(xlog STATIC xlog.cpp xlog.h)
      

      上面是在編譯我們的動態庫文件。

      接下來是測試程序的編寫
      main.cpp

      #include<iostream>
      #include"xlog.h"
      using namespace std;
      int main(){
          XLog log;
          cout<<"test \n";
          return 0;
      }
      

      CMakeLists.txt

      #CMakeLists.txt test_xlog 102
      cmake_minimum_required(VERSION 3.20)
      project(test_xlog)
      # 制定頭文件查找路徑
      include_directories("../xlog")
      
      # 指定庫查找路徑
      link_directories("../xlog/build")
      
      add_executable(test_xlog main.cpp)
      # 指定加載的庫
      target_link_libraries(test_xlog xlog)
      

      這樣我們就能調用我們編譯的靜態庫了

      編譯動態庫

      直接修改一下我們的CMakeLists.txt,在我們的項目目錄內生成

      #CMakeLists.txt test_xlog xlog 102
      cmake_minimum_required(VERSION 3.20)
      project(xlog)
      include_directories("xlog")
      add_library(xlog SHARED ./xlog/xlog.cpp)
      add_executable(xlog_test ./xlog_test/main.cpp)
      target_link_libraries(xlog_test xlog)
      
      

      以上就是我們CMAKE基礎入門的知識了。

      3. CMAKE提高

      3.1 CMAKE的注釋

      3.1.1 在3.0以前的注釋,都是#的行注釋

      CMakeLists.txt

      #這是一條單行注釋
      
      3.1.1 在3.0以后,增加了多行注釋#[[注釋內容]]

      CMakeLists.txt

      #[[這是一條多行注釋
      Hello
      ]]
      

      3.2 CMAKE的調試打印

      3.2.1 基本使用方法

      CMakeLists.txt

      cmake_minimum_required(VERSION 3.20)
      project(message)
      message("參數1")
      message("參數p1" "參數p2" "p3")
      
      3.2.2 message的高級使用-指定日志級別 message([<mode>] "message")

      它的級別有--log-level = <ERROR|WARNING|NOTICE|STATUS|VERBOSE|DEBUG|TRACE>
      輸出的方式 stdoutstderr

      #這是一條單行注釋
      
      #[[這是一條多行注釋
      Hello
      ]]
      cmake_minimum_required(VERSION 3.20)
      project(message)
      message("參數1")
      message("參數p1" "參數p2" "p3")
      
      # 進程退出,生成退出
      message(FATAL_ERROR "TEST FATAL_ERROR")
      # 進程繼續 ,生成退出
      message(SEND_ERROR "TEST SEND_ERROR")
      #WARNING 打印代碼路徑和行號
      message(WARNING "TEST WARNING")
      #NOTICE等同于 none也就是不加 message("TEST NOTICE")
      message(NOTICE "TEST NOTICE")
      #STATUS 加前綴 -- 用戶可能感興趣
      message(STATUS "TEST STATUS")
      #VEBOSE 默認不顯示 用戶需要的詳細信息
      
      message(VERBOSE "TEST VERBOSE")
      
      #設置日志顯示級別
      #cmake -S . -B build --log-level=VERBOSE
      
      message(DEBUG "TEST DEBUG")
      
      message(TRACE "TEST TRACE")
      
      

      3.3 message模塊查找日志和顯示縮進 message (<checkstate> "msg")

      #[[
      CHECK_PASS
      記錄檢查的成功結果
      CHECK_FAIL
      記錄不成功的檢查結果
      CHECK_START
      開始記錄將要執行檢查的結果
      ]]
      
      #開始查找
      message(CHECK_START "Find xcpp")
      #查找庫的代碼
      
      #嵌套查找
      message(CHECK_START "Find xlog")
      #查找XLOG代碼
      message(CHECK_PASS "successed!")
      
      
      #結束查找 查找失敗
      message(CHECK_FAIL "Not Found")
      
      

      3.2 set變量入門和示例

      3.2.1 變量語法 set

      將一個CMAKE變量設置為給定值
      set(<variable> <value>)將變量<variable>的值設置為<value>
      如果沒有指定<value>,那么這個變量就會被撤銷而不是被設置。
      unset(<variable>)撤銷變量

      3.2.2 變量的使用
      • 變量引用是值替換,如果未設置變量,返回空字符串
      • 變量引用可以嵌套并從內向外求值
      • 變量名大小寫敏感

      CMakeLists.txt

      cmake_minimum_required(VERSION 3.20)
      project(test_ver)
      set(VAR1 "測試變量VAR1的值")
      message("VAR="${VAR1})
      message("VAR1 in string ${VAR1}")
      message("\${VAR1}=${VAR1}")
      
      set(VAR2 "VAR1")
      message("VAR2=" ${VAR2})
      message("VAR2=" ${${VAR2}})
      
      unset(VAR1)
      message("\${VAR1}=${VAR1}")
      
      3.2.3 變量讓message輸出不同的顏色
      cmake_minimum_required(VERSION 3.20)
      project(message_color)
      #[[
      033[1;31;40m    <!--1-高亮顯示 31-前景色紅色  40-背景色黑色-->
      033[0m          <!--采用終端默認設置,即取消顏色設置-->
      顯示方式  
      0                終端默認設置
      1                高亮顯示
      4                使用下劃線
      5                閃爍
      7                反白顯示
      8                不可見
      
      前景色            背景色           顏色
      ---------------------------------------
      30                40              黑色
      31                41              紅色
      32                42              綠色
      33                43              黃色
      34                44              藍色
      35                45              紫紅色
      36                46              青藍色
      37                47              白色
      ]]
      
      string(ASCII 27 Esc)
      
      # Esc[0;31m
      set(R "${Esc}[0;31m")   #紅色
      #Esc[0m 
      set(E "${Esc}[m" )      #結束顏色設置
      set(B "${Esc}[1;34m")   #藍色高亮
      set(RB "${Esc}[1;31;40m") #紅色字體黑色背景
      message("${R}紅色內容${E} 默認顏色")
      message("${B}藍色內容${E} 默認顏色")
      message("${RB}紅色字體黑色背景${E} 默認顏色")
      

      3.3 cmake內建變量

      • 提供信息的變量
      • 改變行為的變量
      • 描述系統的變量
      • 控制構建過程的變量

      xlog.h

      //xlog.h
      #ifndef XLOG_H
      #define XLOG_H
      //__declspec(dllexport)
      //__declspec(dllexport) 導出XLog類的函數到lib文件中
      // xlog庫文件調用 dllexport
      // test_xlog 調用 dllimport
      #ifndef _WIN32 //linux mac unix Android
          #define XCPP_API
      #else //windows
          #ifdef xlog_STATIC  //靜態庫
              #define XCPP_API
          #else               //動態庫
              #ifdef xlog_EXPORTS
                  #define XCPP_API __declspec(dllexport) //庫項目調用
              #else
                  #define XCPP_API __declspec(dllimport) //調用庫項目調用
              #endif
          #endif
      #endif
      class XCPP_API XLog
      {
      public:
      	XLog();
      };
      #endif
      

      xlog.cpp

      #include "xlog.h"
      #include <iostream>
      using namespace std;
      XLog::XLog()
      {
      	cout<<"Create XLog"<<endl;
      }
      
      

      CMakeLists.txt

      cmake_minimum_required(VERSION 3.20)
      project(xlog)
      #1 提供信息的變量  項目名稱 ${PROJECT_NAME}對應project的name
      #2 改變行為的變量 BUILD_SHARED_LIBS ON 動態庫 OFF靜態庫 默認OFF
      #set(BUILD_SHARED_LIBS ON)
      set(BUILD_SHARED_LIBS OFF) #靜態庫
      
      #cmake傳遞變量給c++
      add_definitions(-Dxlog_STATIC) #默認值1
      
      #3 描述系統的變量
      message("MSVC = " ${MSVC})
      message("WIN32 = " ${WIN32})
      message("UNIX = " ${UNIX})
      message("CMAKE_SYSTEM_NAME = " ${CMAKE_SYSTEM_NAME})
      
      # 4 控制構建過程的變量 輸出路徑控制 CMAKE_COLOR_MAKEFILE 是否生成makefile的顏色,默認是ON
      set(CMAKE_COLOR_MAKEFILE OFF)
      
      add_library(${PROJECT_NAME} xlog.cpp xlog.h)
      
      

      3.4 include

      從給定的文件中讀取CMake的列表文件
      include(file [OPTIONAL][RESULT_VARIABLE VAR])
      從給定的文件中讀取CMake的清單文件代碼。在清單文件的命令會被立即處理。如果指定OPTIONAL選項,那么如果包含文件不存在的話,不會報錯。如果指定了RESULT_VARIABLE選項,那么var或者會被設置被包含文件的完整路徑,或是NOTFOUND,表示沒有找到改文件

      CMakeLists.txt

      cmake_minimum_required(VERSION 3.20)
      project("cmake_include")
      message("begin include")
      include("cmake/test_cmake.cmake")
      include("cmake/test_cmake.cmake")
      include("cmake/test_cmake1.cmake" OPTIONAL) #OPTIONAL 可選,文件不存在不報錯
      include("cmake/test_cmake1.cmake" OPTIONAL RESULT_VARIABLE ret) #OPTIONAL 返回值
      message("RESULT_VARIABLE ret=${ret}")
      message("end include")
      

      cmake/test_cmake.cmake

      message("cmake/test_cmake.make")
      

      3.5 自動查找所有源碼文件和頭文件

      增加頭文件和代碼后不用修改cmake
      aux_source_directory ---- aux_source_directory("./src" LIB_SRCS)#當前路徑下所有源碼 存入 DIR_SRCS
      file ---- FILE(GLOB H_FILE "${INCLUDE_PATH}/xcpp/*.h")
      FILE(GLOB H_FILE "${INCLUDE_PATH}/*.h<details>

      CMakeFileLists.txt

      #108auto_src_h/CMakeLists.h
      #[[
      108auto_src_h
          CMakeLists.txt
          main.cpp
          src
              xlog.cpp
              xthread.cc
              xtest.c
          include
              xlog.h
              xthread.hpp
      ]]
      
      cmake_minimum_required(VERSION 3.20)
      project("auto_src_h")
      
      #頭文件加載路徑
      set(INCLUDE_PATH  "./include")
      include_directories(${INCLUDE_PATH})
      
      # 找到當前目錄(.)下源碼寫入M_SRC變量中
      aux_source_directory("." M_SRC)
      aux_source_directory("./src" SRC)
      
      #讀取所有的頭文件
      file(GLOB H_FILE "${INCLUDE_PATH}/*.h*")
      
      add_executable(${PROJECT_NAME} ${M_SRC} ${SRC} ${H_FILE})
      
      

      3.6 cmake命令實現程序的分步生成。

      從源碼到執行程序

      • 預處理
      • 編譯
      • 匯編
      • 鏈接
      • 運行---動態庫加載路徑
      • cmake程序分步生成、指定項目和清理

      我們可以使用 cmake --build . --target help查看我們生成的目標文件
      在linux中,預處理會生成.i文件,編譯生成.s文件,然后就會生成.o文件,最后就是直接生成編譯的文件。

      3.7 cmake調試打印生成的具體指令

      • CMAKE_VERBOSE_MAKEFILE
      • cmake --build . -v

      第一種方法

      # CMakeLists.txt 文件名大小寫不敏
      
      #指定cmake最低版本
      cmake_minimum_required(VERSION 3.20)
      
      #構建項目的名稱
      project(first_example)
      
      set(CMAKE_VERBOSE_MAKEFILE ON)
      #構建執行程序
      add_executable(first_cmake first_cmake.cpp)
      
      

      第二種方法 cmake --build . -v

      3.8 cmake設置輸出路徑add_subdirectory

      3.8.1 庫輸出路徑

      通過設置CMAKE_LIBRARY_OUTPUT_DIRECTORY 這個變量

      3.8.2 歸檔輸出路徑

      通過設置CMAKE_ARCHIVE_OUTPUT_DIRECTORY 這個變量

      3.8.3 執行程序輸出路徑

      通過設置CMAKE_RUNTIME_OUTPUT_DIRECTORY 這個變量

      CMakeLists.txt

      #CMakeLists.txt test_xlog  xlog 109cmake_out
      cmake_minimum_required(VERSION 3.20)
      project(xlog)
      include_directories("xlog")
      
      #CMakeLists.txt路徑
      message("CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")
      # .so庫輸出路徑 默認路徑在-B build目錄下
      set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")
      
      #執行程序和dll 動態庫pdb調試文件 輸出路徑
      set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/bin")
      
      #歸檔輸出路徑 靜態庫 .lib 動態庫.lib地址文件 linux靜態庫.a 靜態庫pdb調試文件
      set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")
      
      #添加xlog庫編譯 項目自帶預處理變量 xlog_EXPORTS
      #add_library(xlog SHARED xlog/xlog.cpp)
      
      set(BUILD_SHARED_LIBS OFF) #靜態庫
      #cmake傳遞變量給c++
      add_definitions(-Dxlog_STATIC) #默認值1
      add_library(xlog xlog/xlog.cpp)
      
      # add_library(xlog_d SHARED xlog/xlog.cpp)
      
      #執行文件
      add_executable(test_xlog test_xlog/test_xlog.cpp)
      
      #鏈接庫
      target_link_libraries(test_xlog xlog)
      

      使用我們之前的2個代碼的例子,現在還有幾個遺留的問題

      • 多個項目不同輸出路徑
      • debug和release不同輸出
      • 一個項目同時要設置靜態庫和動態庫

      3.9 cmake add_subdirectory

      ./CMakeFileLists.txt

      #CMakeLists.txt test_xlog  xlog 109cmake_out
      cmake_minimum_required(VERSION 3.20)
      project(xlog)
      include_directories("xlog")
      
      #CMakeLists.txt路徑
      message("CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")
      # .so庫輸出路徑 默認路徑在-B build目錄下
      set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")
      
      #執行程序和dll 動態庫pdb調試文件 輸出路徑
      set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/bin")
      
      #歸檔輸出路徑 靜態庫 .lib 動態庫.lib地址文件 linux靜態庫.a 靜態庫pdb調試文件
      set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/lib")
      
      #set(BUILD_SHARED_LIBS OFF) #靜態庫
      #cmake傳遞變量給c++
      #add_definitions(-Dxlog_STATIC) #默認值1
      
      set(BUILD_SHARED_LIBS ON) #動態庫
      
      add_subdirectory("xlog")
      add_subdirectory("test_xlog")
      
      

      ./test_xlog/CMakeLists.txt

      #CMakeLists.txt test_xlog 102
      cmake_minimum_required(VERSION 3.20)
      project(test_xlog)
      #指定頭文件查找路徑 
      include_directories("../xlog")
      
      # 指定庫查找路徑  window自動找 ../xlog/build/Debug  ../xlog/build/Release
      link_directories("../xlog/build")
      
      add_executable(test_xlog test_xlog.cpp)
      
      # 指定加載的庫
      target_link_libraries(test_xlog xlog)
      

      ./xlog/CMakeLists.txt

      #106cmake_system_ver/CMakeLists.txt
      cmake_minimum_required(VERSION 3.20)
      project(xlog)
      
      #3 描述系統的變量
      message("MSVC = " ${MSVC})
      message("WIN32 = " ${WIN32})
      message("UNIX = " ${UNIX})
      message("CMAKE_SYSTEM_NAME = " ${CMAKE_SYSTEM_NAME})
      
      # 4 控制構建過程的變量 輸出路徑控制 CMAKE_COLOR_MAKEFILE 是否生成makefile的顏色,默認是ON
      set(CMAKE_COLOR_MAKEFILE OFF)
      add_library(${PROJECT_NAME} xlog.cpp xlog.h)
      
      

      4.Cmake常用語法

      4.1 cmake if語法說明與常量判斷代碼演示

      if基礎表達式
      常量
      if()
      1,ON,YES,TRUE,Y或非零數(包括浮點數),則為真。
      0,OFF,FALSE,N,IGNORE,NOTFOUND,空字符串,或者以suffix結尾-NOTFOUND則為假

      if(1)
          message("1 is true")
      endif()
      
      if(0)
          message("0 is true?")
      else()
          message("0 is false")
      endif()
      
      if(OFF)
          message("OFF is true?")
      elseif(NO)
          message("NO is true?")
      else()
          message("OFF ON is False")
      endif(OFF)
      
      if()
         message("empty is true?")
      else()
          message("empty is false?")
      endif()
      
      if(-1)
          message("-1 is true")
      endif(-1)
      
      if(123)
          message("123 is true")
      endif(123)
      
      if(0.1)
      message("0.1 is true")
      endif(0.1)
      
      if(-NOTFOUND)
          message("-NOTFOUND is true")
      else()
          message("-NOTFOUND is false")
      endif(-NOTFOUND)
      

      變量
      if()
      非假值常量為真。未定義和其他為假。
      環境變量總為假
      宏參數不是變量

      if(VAR_NOT_DEF)
          message("VAR_NOT_DEF is true?")
      else()
          message("VAR_NOT_DEF is false?")
      endif(VAR_NOT_DEF)
      
      set(VAR1_TRUE TRUE)
      if(VAR1_TRUE)
         message("VAR1_TRUE is true!") 
      endif(VAR1_TRUE)
      
      

      if()
      字符串
      字符串的值時常量真則為真
      其他帶引號的字符串始終計算為false

      if("TRUE")
          message("string TRUE is true!")
      endif("TRUE")
      
      if("ON")
          message("string ON is true!")
      endif("ON")
      
      if("test")
          message("string test is true!")
      else()
          message("string test is false!")
      endif("test")
      
      if("1234")
      message("string 1234 is true!")
      endif("1234")
      
      

      4.2 if邏輯操作符

      NOT、AND、OR
      邏輯運算符
      if(NOT )
      如果條件不為真,則為真。
      if( AND )
      如果兩個條件都是真的,則為真。

      if( OR )
      如果任一條件是真的,則為真。

      if((condition) AND (condition OR (condition)))
      首先評估括號內的條件,然后評估其余條件。

      set(VAR_OFF OFF)
      if(NOT VAR_OFF)
          message("NOT VAR_OFF(true)")    
      endif(NOT VAR_OFF)
      
      if(TRUE AND ON)
          message("TRUE and ON is true")
      endif(TRUE AND ON)
      
      if(TRUE AND OFF)
          message("TRUE and OFF is true")
      else()
          message("TRUE and OFF is false")
      endif(TRUE AND OFF)
      
      if(TRUE OR OFF)
          message("TRUE or OFF is true")
      else()
          message("TRUE or OFF is false")
      endif(TRUE OR OFF)
      
      if(TRUE AND (OFF OR ON))
          message("TRUE AND (OFF OR ON) is true")
      endif(TRUE AND (OFF OR ON))
      
      

      4.3 一元判斷、二元判斷 、正則匹配

      一元判斷

      • EXISTS
      • COMMAND
      • DEFINED
      set(VAR_DEF OFF)
      if(DEFINED VAR_DEF)
          message("VAR_DEF is DEFINED")
      endif(DEFINED VAR_DEF)
      
      if(DEFINED VAR_NOT_DEF)
          message("VAR_NOT_DEF is DEFINED?")
      else()
          message("VAR_NOT DEF not DEFINED?")
      endif(DEFINED VAR_NOT_DEF)
      

      二元判斷

      • EQUAL
      • EQUAL,LESS,LESS_EQUAL,GREATER,GREATER_EQUAL
      • STREQUAL,STRLESS,STRLESS_EQUAL,STRGREATER,STRGREATER_EQUAL
      • VERSION_EQUAL,VERSION_LESS,VERSION_LESS_EQUAL,VERSION_GREATER,VERSION_GREATER_EQUAL
      set(VAR1 123)
      if(VAR1 EQUAL "123")
          message("VAR1 EQUAL 123")    
      endif(VAR1 EQUAL "123")
      
      set(VAR2 "test")
      if(VAR2 EQUAL "test")
          message("VAR2 EQUAL test")
      else()
          message("VAR2 not EQUAL test")    
      endif(VAR2 EQUAL "test")
      
      set(VAR2 "test")
      if(VAR2 STREQUAL "test")
          message("VAR2 STREQUAL test")
      else()
          message("VAR2 not STREQUAL test")    
      endif(VAR2 STREQUAL "test")
      
      if(VAR1 STREQUAL 123)
          message("VAR1 STREQUAL 123")   
      else()
          message("VAR1 not STREQUAL 123")  
      endif(VAR1 STREQUAL 123)
      

      正則匹配
      MATCHES if(<variable|string> MATCHES regex)

      
      if("abcd1234" MATCHES "[a-z]+")
          message(" \"abcd1234\" MATCHES \"[a-z]+\"")
      endif("abcd1234" MATCHES "[a-z]+")
      
      

      4.4 cmake cache緩存變量設置

      設置公式set(<variable> <value>... CACHE <type> <docstring> [FORCE])

      type

      • BOOL
        ON/OFF 選擇框
      • FILEPATH 文件選擇
      • PATH 目錄選擇
      • STRING 字符串
      • INTERNAL 內部變量

      docstring 變量說明
      FORCE 強制修改緩存,不設置第二次調用不改

      cmake_minimum_required(VERSION 3.20)
      project(cmake_cache)
      #設置緩存變量
      set(VAR1 "CACHE VAR1" CACHE STRING "cache doc")
      #緩存變量第二修改不生效
      set(VAR1 "CACHE VAR2" CACHE STRING "cache doc")
      message("VAR1 = ${VAR1}")
      
      #強制修改緩存
      set(VAR1 "CACHE VAR3" CACHE STRING "cache doc" FORCE)
      

      4.5 普通變量和全局CACHE變量的作用域

      # CACHE變量作用域是全局的
      # 普通變量的作用域自身和子模塊
      
      set(VAR2_NORMAL "test normal")
      message("in main")
      message("VAR2_NORMAL = ${VAR2_NORMAL}")
      

      4.6 cmake-gui與CACHE緩存變量的各種類型

      #BOOl勾選
      set(VAR_BOOL1 "ON" CACHE BOOL "VAR bool 001")
      set(VAR_BOOL2 "OFF" CACHE BOOL "VAR bool 002")
      message("-------------------------------------------")
      message("VAR_BOOL1 = ${VAR_BOOL1}")
      message("VAR_BOOL2 = ${VAR_BOOL2}")
      #選擇文件
      set(VAR_FILE "filepath" CACHE FILEPATH "var FILEPATH")
      #選擇文件夾
      set(VAR_PATH "PATH" CACHE PATH "var PATH")
      #內部緩存變量
      set(VAR_INTERNAL "INTERNAL" CACHE INTERNAL "var INTERNAL")
      

      4.7 cmake用戶修改該配置和option

      
      option(OPT1 "opt1 doc" OFF)
      option(OPT2 "opt2 doc" ON)
      

      在Linux下,我們先進行項目的生成,在用CCMAKE進行生成。

      4.8 cmake CACHE覆蓋策略設置

      當次政策設置為NEW時,set(CACHE)命令不會從當前范圍中刪除任何同名的普通變量。在以下情況,該OLD行為會從當前作用域中刪除任何同名的普通變量.
      cmake_policy(SET CMP0126 NEW)
      $CACHE{NVAR1}

      cmakelists.txt

      #普通變量
      set(NVAR1 "normal var1")
      #設置緩存變量覆蓋同名普通變量的策略
      # OLD 刪除同名普通變量
      # NEW 不刪除普通變量,要訪問cache要用 $CACHE{var_name}
      cmake_policy(SET CMP0126 NEW)
      
      #cache變量  
      set(NVAR1 "cache var1" CACHE STRING "cache doc")
      
      message("NVAR1 = \t ${NVAR1}")
      message("CACHE{NVAR1} = \t $CACHE{NVAR1}") #直接查找緩存變量
      

      4.9傳遞緩存變量

      -D 傳遞緩存變量
      cmake內置緩存變量

      • BUILD_SHARED_LIBS
      • set(BUILD_SHARED_LIBS OFF CACHE BOOL "lib")
      • message("BUILD_SHARED_LIB=${BUILD_SHARED_LIBS}")
      #命令行傳遞緩存變量
      #cmake -S . -B build -D PARA1=para001
      message("PARA1 = ${PARA1}")
      set(BUILD_SHARED_LIBS OFF CACHE BOOL "so or a")
      message("BUILD_SHARED_LIBS = ${BUILD_SHARED_LIBS}")
      message("\n=================")
      

      4.10 cmake變量和屬性有什么區別

      屬性類似為成員變量
      變量類似為全局變量
      屬性的語法

      set_property(<GLOBAL                      |
                    DIRECTORY [<dir>]           |
                    TARGET    [<target1> ...]   |
                    SOURCE    [<src1> ...]
                              [DIRECTORY <dirs> ...]
                              [TARGET_DIRECTORY <targets> ...] |
                    INSTALL   [<file1> ...]     |
                    TEST      [<test1> ...]     |
                    CACHE     [<entry1> ...]    >
                   [APPEND] [APPEND_STRING]
                   PROPERTY <name> [<value1> ...])
      
      get_property(<variable>
                   <GLOBAL             |
                    DIRECTORY [<dir>]  |
                    TARGET    <target> |
                    SOURCE    <source>
                              [DIRECTORY <dir> | TARGET_DIRECTORY <target>] |
                    INSTALL   <file>   |
                    TEST      <test>   |
                    CACHE     <entry>  |
                    VARIABLE           >
                   PROPERTY <name>
                   [SET | DEFINED | BRIEF_DOCS | FULL_DOCS])
      
      define_property(<GLOBAL | DIRECTORY | TARGET | SOURCE |
                       TEST | VARIABLE | CACHED_VARIABLE>
                       PROPERTY <name> [INHERITED]
                       [BRIEF_DOCS <brief-doc> [docs...] ]
                       [FULL_DOCS <full-doc> [docs...] ]
                       [INITIALIZE_FROM_VARIABLE <variable>])  
      

      例子

      # 全局屬性
      #設置全局屬性
      set_property(GLOBAL PROPERTY TEST_GLOBAL "test global 001")
      
      #獲取全局屬性
      get_property(val GLOBAL PROPERTY TEST_GLOBAL)
      message("TEST_GLOBAL = ${val}")
      
      #訪問子目錄中的全局屬性
      add_subdirectory(sub1)
      get_property(val GLOBAL PROPERTY SUB1_GLOBAL)
      message("SUB1_GLOBAL = ${val}")
      
      
      #APPEND APPEND_STRING
      # APPEND 數組方式添加 TEST_APPEND = append 001;append 002;append 003 
      set_property(GLOBAL APPEND PROPERTY TEST_APPEND "append 001")
      set_property(GLOBAL APPEND PROPERTY TEST_APPEND "append 002")
      set_property(GLOBAL APPEND PROPERTY TEST_APPEND "append 003")
      get_property(val GLOBAL PROPERTY TEST_APPEND)
      message("TEST_APPEND = ${val}")
      
      
      # APPEND_STRING 字符串拼接 append string 001 append string 002 append string 003
      set_property(GLOBAL APPEND_STRING PROPERTY TEST_APPEND_STRING "append string 001 ")
      set_property(GLOBAL APPEND_STRING PROPERTY TEST_APPEND_STRING "append string 002 ")
      set_property(GLOBAL APPEND_STRING PROPERTY TEST_APPEND_STRING "append string 003 ")
      get_property(val GLOBAL PROPERTY TEST_APPEND_STRING)
      message("TEST_APPEND_STRING = ${val}")
      

      4.11 cmake define_property屬性說明設置

      #get_property SET | DEFINED 
      set_property(GLOBAL PROPERTY P1 "p1")
      get_property(var GLOBAL PROPERTY P1)
      message("P1 SET = ${var}")
      if(var)
          message("P1 is set")
      else()
          message("P1 not set")
      endif()
      #只有調用define_property之后才會為1
      get_property(var GLOBAL PROPERTY P1 DEFINED)
      message("P1 DEFINED = ${var}")
      if(NOT var)
          message("P1 not defined")
      endif()
      
      #定義屬性 不需要賦值
      define_property(GLOBAL PROPERTY TEST_DEF  BRIEF_DOCS "p1 brief docs")
      get_property(var GLOBAL PROPERTY TEST_DEF DEFINED )
      message("TEST_DEF DEFINED = ${var}")
      

      4.12 cmake文件屬性和給c++傳遞預處理變量

      # cmake傳遞變量給c++
      # cmake 預置屬性 COMPILE_DEFINITIONS    傳遞預處理變量(宏變量) -DPARA1 1234
      set_property(SOURCE main.cpp PROPERTY COMPILE_DEFINITIONS "PARA1=1234")
      add_executable(${PROJECT_NAME} main.cpp)
      
      

      4.13 cmake目標屬性設置給c++傳遞多個宏

      #cmake 目標屬性 目標必須已經存在
      set_property(TARGET ${PROJECT_NAME} PROPERTY TVAR "tval")
      get_property(var TARGET ${PROJECT_NAME} PROPERTY TVAR)
      message("TVAR= ${var}")
      #給C++傳遞宏
      set_property(TARGET ${PROJECT_NAME} PROPERTY COMPILE_DEFINITIONS "PARA2=\"test_para2\"")
      #追加設置
      set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS "PARA3=\"test_para3\"")
      
      
      

      推薦一個零聲學院免費教程,個人覺得老師講得不錯,
      分享給大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
      fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,
      TCP/IP,協程,DPDK等技術內容,點擊立即學習:
      服務器
      音視頻
      dpdk
      Linux內核

      posted @ 2022-09-25 23:22  飄雨的河  閱讀(458)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国色天香中文字幕在线视频| 综合久久av一区二区三区| 好吊视频一区二区三区在线| 精品视频不卡免费观看| 漂亮人妻被黑人久久精品| 婷婷色香五月综合缴缴情香蕉| 伊人色综合一区二区三区| 人妻放荡乱h文| 国产精品美女黑丝流水| 99在线精品视频观看免费| 台湾佬自拍偷区亚洲综合| 国产精品免费看久久久| 男女啪啪免费观看网站| 国产美女高潮流白浆视频| 久久久久99精品成人片牛牛影视| 久久婷婷成人综合色| 亚洲成人av在线系列| 精品无码专区久久久水蜜桃| 色偷偷久久一区二区三区| 中国女人熟毛茸茸A毛片| 99精品全国免费观看视频| 激情综合网激情综合网五月| 久久一级黄色大片免费观看| 国产成人午夜在线视频极速观看 | 免费观看的av在线播放| 97视频精品全国免费观看| 免费专区丝袜调教视频| 99久久机热/这里只有精品| 午夜精品区| 久在线精品视频线观看| 成人麻豆日韩在无码视频| 在线午夜精品自拍小视频| 亚洲精品日本一区二区| 在线高清免费不卡全码| 大屁股国产白浆一二区| 成人免费在线播放av| 孕妇怀孕高潮潮喷视频孕妇| 午夜成人精品福利网站在线观看| 一本色道久久综合熟妇人妻| 免费看的一级毛片| 久久精品亚洲中文字幕无码网站|