CMake 兩種變量原理

CMake 兩種變量原理

 

博文原始鏈接


摘要:

本文記錄一下 CMake 變量的定義、原理及其使用。CMake 變量包含 Normal Variables、Cache Variables。通過 set 指令可以設置兩種不同的變量。也可以在 CMake 腳本中使用和設置環境變量。set(ENV{<variable>} <value>...),本文重點講述 CMake 腳本語言特有的兩種變量。

 

正文:

1、兩種變量的定義參考

  • Normal Variables

    通過 set(<variable> <value>... [PARENT_SCOPE])這個命令來設置的變量就是 Normal Variables。例如 set(MY_VAL "666") ,此時 MY_VAL 變量的值就是 666。

  • Cache Variables

    通過 set(<variable> <value>... CACHE <type> <docstring> [FORCE])這個命令來設置的變量就是 Cache Variables。例如 set(MY_CACHE_VAL "666" CACHE STRING INTERNAL),此時 MY_CACHE_VAL 就是一個 CACHE 變量。

2、兩種變量的作用域原理及使用

1、Normal Variables

​ 作用域屬於整個 CMakeLists.txt 文件,當該文件包含了 add_subdirectory()、include()、macro()、function()語句時,會出現兩種不同的效果。

(1)、包含 add_subdirectory()、function()。(本質是值拷貝)

假設,我們在工程根目錄 CMakeLists.txt 文件中使用 add_subdirectory(src) 包含另一個 src 目錄,在 src 目錄中有另一個 CMakeLists.txt 文件。在終端運行的目錄結構如下:

<span style="color:#000000"><code><span style="color:#2b91af">$</span> tree
.
├── CMakeLists.txt
└── src
    └── CMakeLists.txt

1 directory, 2 files</code></span>

以根目錄 CMake 文件爲父目錄,src 目錄爲子目錄,此時子目錄 CMake 文件會拷貝一份父目錄文件的 Normal 變量。需要說明的是,我們在子目錄中如果想要修改父目錄 CMake 文件包含的 Normal 變量。必須通過 set(... PARENT_SCOPE) 的方式。下面通過例子來說明。

在父/根目錄的 CMakeLists.txt 文件內容如下:

<span style="color:#000000"><code><span style="color:#0000ff">cmake_minimum_required</span>(VERSION 3.10)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"父目錄 CMakeLists.txt 文件"</span>)
<span style="color:#0000ff">set</span>(MY_VAL <span style="color:#a31515">"666"</span>)

<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第一次在父目錄 MY_VAL=${MY_VAL}"</span>)
<span style="color:#0000ff">add_subdirectory</span>(src) 
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第二次在父目錄,MY_VAL=${MY_VAL}"</span>)</code></span>

在子目錄 src/CMakeLists.txt 文件內容如下:

<span style="color:#000000"><code><span style="color:#0000ff">cmake_minimum_required</span>(VERSION 3.10)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"進入子目錄 src/CMakeLists.txt 文件"</span>)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"在子目錄,MY_VAL=${MY_VAL}"</span>)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"退出子目錄"</span>)</code></span>

運行結果:

<span style="color:#000000"><code><span style="color:#2b91af">$</span> cmake .
父目錄 CMakeLists.txt 文件
第一次在父目錄 MY_VAL=666
進入子目錄 src/CMakeLists.txt 文件
在子目錄,MY_VAL=666
退出子目錄
第二次在父目錄,MY_VAL=666</code></span>

從結果可以看出,在子目錄 CMake 文件中可以直接使用父目錄定義的 MY_VAL 變量的值 666。當在子目錄 CMake 文件中修改 MY_VAL 變量值,看看在父目錄中 MY_VAL 的值如何變化。下面僅僅在子目錄 CMake 文件中加入一行代碼 set(MY_VAL "777"),最後的子目錄 CMake 文件代碼如下:

<span style="color:#000000"><code><span style="color:#0000ff">cmake_minimum_required</span>(VERSION 3.10)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"進入子目錄 src/CMakeLists.txt 文件"</span>)
<span style="color:#0000ff">set</span>(MY_VAL <span style="color:#a31515">"777"</span>) <span style="color:#008000"># 剛剛加入的</span>

<span style="color:#0000ff">message</span>(<span style="color:#a31515">"在子目錄,MY_VAL=${MY_VAL}"</span>)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"退出子目錄"</span>)</code></span>

運行結果:

<span style="color:#000000"><code><span style="color:#2b91af">$</span> cmake .
父目錄 CMakeLists.txt 文件
第一次在父目錄 MY_VAL=666
進入子目錄 src/CMakeLists.txt 文件
在子目錄,MY_VAL=777
退出子目錄
第二次在父目錄,MY_VAL=666</code></span>

我們發現在 src/CMakeLists.txt 中打印的 MY_VAL 的值是 777,然後退出子目錄回到根目錄後,打印 MY_VAL 的值仍然是 666。這就說明了:子目錄的 CMakeLists.txt 文件僅僅是拷貝了一份父目錄的 Normal 變量,即使在子目錄 CMake 文件中修改了 MY_VAL 變量,那也只是子目錄自己的變量,不是父目錄的變量。因爲 Normal 變量的作用域就是以 CMakeLists.txt 文件爲基本單元。那麼我們如何在子目錄 CMake 文件中修改父目錄 CMake 文件的 Normal 變量呢? 我們需要在子目錄 CMakeLists.txt 文件中設置 MY_VAL 時,加上 PARENT_SCOPE 屬性。即用如下代碼: set(MY_VAL "777" PARENT_SCOPE),子目錄 CMakeLists.txt 文件如下:

<span style="color:#000000"><code><span style="color:#0000ff">cmake_minimum_required</span>(VERSION 3.10)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"進入子目錄 src/CMakeLists.txt 文件"</span>)
<span style="color:#0000ff">set</span>(MY_VAL <span style="color:#a31515">"777"</span> PARENT_SCOPE) <span style="color:#008000"># 修改處</span>

<span style="color:#0000ff">message</span>(<span style="color:#a31515">"在子目錄,MY_VAL=${MY_VAL}"</span>)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"退出子目錄"</span>)</code></span>

運行結果:

<span style="color:#000000"><code><span style="color:#2b91af">$</span> cmake .
父目錄 CMakeLists.txt 文件
第一次在父目錄 MY_VAL=666
進入子目錄 src/CMakeLists.txt 文件
在子目錄,MY_VAL=666
退出子目錄
第二次在父目錄,MY_VAL=777</code></span>

可以看出在第二次回到父目錄時,MY_VAL 的值已經變成了 777。同理,對於 function() 最開始的結論也適用。代碼如下:

<span style="color:#000000"><code><span style="color:#0000ff">cmake_minimum_required</span>(VERSION 3.10)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"父目錄 CMakeLists.txt 文件"</span>)
<span style="color:#0000ff">set</span>(MY_VAL <span style="color:#a31515">"666"</span>)

<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第一次在父目錄 MY_VAL=${MY_VAL}"</span>)

<span style="color:#008000"># 函數定義</span>
<span style="color:#0000ff">function</span>(xyz test_VAL) <span style="color:#008000"># 函數定義處!</span>
 <span style="color:#0000ff">set</span>(MY_VAL <span style="color:#a31515">"888"</span> PARENT_SCOPE)
 <span style="color:#0000ff">message</span>(<span style="color:#a31515">"functions is MY_VAL=${MY_VAL}"</span>)
<span style="color:#0000ff">endfunction</span>(xyz)

xyz(<span style="color:#008000">${MY_VAL}</span>) <span style="color:#008000"># 調用函數</span>
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第二次在父目錄,MY_VAL=${MY_VAL}"</span>)
</code></span>

運行結果:

<span style="color:#000000"><code>父目錄 CMakeLists.txt 文件
第一次在父目錄 MY_VAL=666
functions is MY_VAL=666
第二次在父目錄,MY_VAL=888</code></span>

可以看出在該函數中使用 MY_VAL 這個變量值,其實就是一份父目錄變量的值拷貝,此時打印值爲 666。在 函數中修改值,那麼也是用 set(${MY_VAL} 888 PARENT_SCOPE)。此時,退出函數第二次打印變量值時。該值就是在函數中修改好的值 888。 本質講,對於 function() 而言,剛剛說到的父目錄其實不是嚴格正確的。因爲函數定義可以是在其他 .cmake 模塊文件中定義的。也可以在其他 CMakeLists.txt 文件中調用,因此準確的說,這裏的父目錄應該改爲『調用函數的地方所屬的 CMakeLists.txt 』,我們做的這個實驗是在根目錄 CMakeLists.txt 文件中定義了函數,又在本文件中使用了。因此之前的說法理解其意思即可。對於 add_subdirectory() 而言,其實也是說調用的地方。下面的 include()、macro() 例子會涉及到,將 function() 放在一個外部的 .cmake 文件中。那裏也會說明 function() 與 macro() 的不同。

(2)、包含 include()、macro() (本質有點類似 c 中的 #include 預處理含義)

現在在上面的根目錄中加入了一個 cmake_modules 目錄。目錄中有一個 Findtest.cmake 文件。新的目錄結構如下:

<span style="color:#000000"><code><span style="color:#2b91af">$</span> tree
.
├── CMakeLists.txt
├── cmake_modules
│   └── Findtest.cmake
└── src
    └── CMakeLists.txt

2 directories, 3 files</code></span>

在根目錄中的 CMakeLists.txt 文件包含的代碼如下:

<span style="color:#000000"><code><span style="color:#0000ff">cmake_minimum_required</span>(VERSION 3.10)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"父目錄 CMakeLists.txt 文件"</span>)
<span style="color:#0000ff">set</span>(MY_VAL <span style="color:#a31515">"666"</span>)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第一次在父目錄 MY_VAL=${MY_VAL}"</span>)

<span style="color:#008000"># 使用 include() 文件的宏</span>
list(APPEND CMAKE_MODULE_PATH <span style="color:#008000">${PROJECT_SOURCE_DIR}</span>/cmake_modules) 
<span style="color:#0000ff">include</span>(Findtest) <span style="color:#008000"># 從 CMAKE_MODULE_PATH 包含的路徑中搜索 Findtest.cmake 文件</span>
<span style="color:#008000">#test(${MY_VAL}) # 調用宏</span>
<span style="color:#008000">#xyz(${MY_VAL}) # 調用函數</span>

<span style="color:#008000">#find_package(test REQUIRED) # 從 CMAKE_MODULE_PATH 包含的路徑中搜索 Findtest.cmake 文件 與 include () 兩者的效果是一樣的!</span>

<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第二次在父目錄,MY_VAL=${MY_VAL}"</span>)

<span style="color:#0000ff">message</span>(<span style="color:#a31515">"include test=${test_VAL}"</span>) 
<span style="color:#008000">#message("macro_val=${macro_val}")</span></code></span>

cmake_modules/Findtest.cmake 文件內容如下:

<span style="color:#000000"><code><span style="color:#008000"># 該文件定義了一個函數以及一個宏</span>
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"進入 Findtest.cmake 文件"</span>)

<span style="color:#0000ff">set</span>(test_VAL <span style="color:#a31515">"222"</span>) <span style="color:#008000"># 驗證根目錄 CMake 文件能夠訪問這個變量</span>
<span style="color:#0000ff">set</span>(MY_VAL <span style="color:#a31515">"000"</span>) <span style="color:#008000"># 測試 include() 效果</span>

<span style="color:#008000"># 宏定義</span>
<span style="color:#0000ff">macro</span>(test MY_VA) <span style="color:#008000"># 定義一個宏!</span>
 <span style="color:#0000ff">set</span>(macro_val <span style="color:#a31515">"1"</span>) <span style="color:#008000"># 宏內部定義變量</span>
 <span style="color:#0000ff">message</span>(<span style="color:#a31515">"macro is MY_VAL=${MY_VA}"</span>)
 <span style="color:#0000ff">set</span>(MY_VAL <span style="color:#a31515">"999"</span>) <span style="color:#008000"># 直接修改的就是調用該宏所處的文件中的 Normal 變量</span>
<span style="color:#0000ff">endmacro</span>(test)

<span style="color:#008000"># 函數定義</span>
<span style="color:#0000ff">function</span>(xyz test_VAL)
 <span style="color:#0000ff">set</span>(MY_VAL <span style="color:#a31515">"888"</span> PARENT_SCOPE)  <span style="color:#008000"># 修改 調用者的 變量</span>
 <span style="color:#0000ff">message</span>(<span style="color:#a31515">"function is MY_VAL=${MY_VAL}"</span>)
<span style="color:#0000ff">endfunction</span>(xyz)</code></span>

運行結果:

<span style="color:#000000"><code><span style="color:#2b91af">$</span> cmake .
父目錄 CMakeLists.txt 文件
第一次在父目錄 MY_VAL=666
進入 Findtest.cmake 文件
第二次在父目錄,MY_VAL=000
include test=222</code></span>

從結果可以看出,include() 內部是可以修改調用者 MY_VAL 變量。include() 包含的文件內定義的變量 test_VAL,也可以在調用 include() 的 CMakeLists.txt 文件中直接訪問,同樣的對於 macro() 也適用,在根目錄 CMake 文件中調用宏,即取消 test(MYVAL)以及message("macroval=MYVAL)以及message("macroval={macro_val}") 部分的註釋,此時最後輸出結果 :

<span style="color:#000000"><code><span style="color:#2b91af">$</span> cmake .
父目錄 CMakeLists.txt 文件
第一次在父目錄 MY_VAL=666
進入 Findtest.cmake 文件
macro is MY_VAL=000
第二次在父目錄,MY_VAL=999
include test=222
macro_val=1</code></span>

可以看出,這次輸出的結果在第二次進入父目錄後,MY_VAL 變量的值就是 999 了。注意到在根目錄中 CMakeLists.txt 中 註釋語句中有一個 find_package() ,這個和 include() 其實都是一樣的結果。

總結:

結合 include() 、macro() 最後結果,能夠得出一個結論:通過 include() 和 macro() 相當於把這兩部分包含的代碼直接加入根目錄 CMakeLists.txt 文件中去執行,相當於他們是一個整體。因此變量直接都是互通的。這就有點像 C/C++ 中的 #include 包含頭文件的預處理過程了。這一點其實與剛開始講的 function() 、add_subdirectory() 完全不同,在函數以及 add_subdirectory() 中,他們本身就是一個不同的作用域範圍,僅僅通過拷貝調用者的 Normal 值(僅僅在調用 add_subdirectory() / function() 之前的 Normal 變量),如果要修改調用者包含的 Normal 變量,那麼只能通過 set(MY_VAL "某個值" PARENT_SCOPE)註明我們修改的是調用者 Normal 值。雖然在 C/C++ 中,可以通過指針的方式,通過函數可以修改外部變量值,但是在 CMake 腳本語言中 function() 雖然能夠傳入形式參數,但是者本質上就是 C/C++ 中的值拷貝。而不是引用。上面所說的 Normal 變量其實就是一個局部變量。

2、Cache Variables

相當於一個全局變量,我們在同一個 cmake 工程中都可以使用。Cache 變量有以下幾點說明:

  • Cache 變量 CMAKE_INSTALL_PREFIX 默認值是 /usr/local (可以在生成的 CMakeCache.txt 文件中查看),這時候如果我們 在某個 CMakeLists.txt 中,仍然使用 set(CMAKE_INSTALL_PREFIX "/usr"),那麼此時我們 install 的時候,CMake 以後面的 /usr 作爲 CMAKE_INSTALL_PREFIX 的值,這是因爲 CMake 規定,有一個與 Cache 變量同名的 Normal 變量出現時,後面使用這個變量的值都是以 Normal 爲準,如果沒有同名的 Normal 變量,CMake 纔會自動使用 Cache 變量。
  • 所有的 Cache 變量都會出現在 CMakeCache.txt 文件中。這個文件是我們鍵入 cmake .命令後自動出現的文件。打開這個文件發現,CMake 本身會有一些默認的全局 Cache 變量。例如:CMAKE_INSTALL_PREFIX、CMAKE_BUILD_TYPE、CMAKE_CXX_FLAGSS 等等。可以自行查看。當然,我們自己定義的 Cache 變量也會出現在這個文件中。Cache 變量定義格式爲 set(<variable> <value> CACHE STRING INTERNAL)。這裏的 STRING可以替換爲 BOOL FILEPATH PATH ,但是要根據前面 value 類型來確定。參考
  • 修改 Cache 變量。可以通過 set(<variable> <value> CACHE INSTERNAL FORCE),另一種方式是直接在終端中使用 cmake -D var=value ..來設定默認存在的CMake Cache 變量。

下面通過一個例子來說明以上三點:

首先看一下目錄樹結構:

<span style="color:#000000"><code><span style="color:#2b91af">$</span> tree
.
├── CMakeLists.txt
└── src
    └── CMakeLists.txt

1 directory, 2 files</code></span>

根目錄 CMakeLists.txt 文件內容如下:

<span style="color:#000000"><code><span style="color:#0000ff">cmake_minimum_required</span>(VERSION 3.10)
<span style="color:#0000ff">set</span>(MY_GLOBAL_VAR <span style="color:#a31515">"666"</span> CACHE <span style="color:#0000ff">STRING</span> INTERNAL )
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第一次在父目錄 CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"</span>)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第一次在父目錄 MY_GLOBAL_VAR=${MY_GLOBAL_VAR}"</span>)
<span style="color:#0000ff">add_subdirectory</span>(src)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第二次在父目錄 CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"</span>)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第二次在父目錄 MY_GLOBAL_VAR=${MY_GLOBAL_VAR}"</span>)
<span style="color:#0000ff">set</span>(CMAKE_INSTALL_PREFIX <span style="color:#a31515">"-->usr"</span> )
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第三次在父目錄 CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"</span>)</code></span>

src/CMakeLists.txt 文件內容如下:

<span style="color:#000000"><code><span style="color:#0000ff">cmake_minimum_required</span>(VERSION 3.10)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"子目錄,CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}"</span>)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"子目錄,MY_GLOBAL_VAR=${MY_GLOBAL_VAR}"</span>)
<span style="color:#0000ff">set</span>(CMAKE_INSTALL_PREFIX <span style="color:#a31515">"/usr"</span> CACHE <span style="color:#0000ff">STRING</span> INTERNAL FORCE)
<span style="color:#0000ff">set</span>(MY_GLOBAL_VAR <span style="color:#a31515">"777"</span> CACHE <span style="color:#0000ff">STRING</span> INTERNAL FORCE )</code></span>

運行結果:

<span style="color:#000000"><code><span style="color:#2b91af">$</span> cmake .
第一次在父目錄 CMAKE_INSTALL_PREFIX=/usr/local
第一次在父目錄 MY_GLOBAL_VAR=666
子目錄,CMAKE_INSTALL_PREFIX=/usr/local
子目錄,MY_GLOBAL_VAR=666
第二次在父目錄 CMAKE_INSTALL_PREFIX=/usr
第二次在父目錄 MY_GLOBAL_VAR=777
第三次在父目錄 CMAKE_INSTALL_PREFIX=-->usr</code></span>

程序說明:首先在根目錄中打印一下當前的 Cache 變量 CMAKE_INSTALL_PREFIX 值,主要看看默認值是什麼,然後在子目錄 src/CMakeLists.txt 中再次打印和修改該 Cache 值,目的是熟悉修改全局 Cache 變量,當返回根目錄 CMakeLists.txt 文件中再次執行第二次打印該 Cache 值時,主要看一看在子目錄中修改後的效果。接着在根目錄中設定一個 CMAKE_INSTALL_PREFIX 的 Normal 同名變量,此時第三次打印 CMAKE_INSTALL_PREFIX 的值,此時是爲了證明,當有與 Cache 同名的 Normal 變量出現時,CMake 會優先使用 Normal 屬性的值。通過設定 MY_GLOBAL_VAR 主要是爲了說明可以自己設定全局 Cache 變量。最後的結果如上面顯示,當我們再次執行 cmake . 的時候,程序結果如下:

<span style="color:#000000"><code><span style="color:#2b91af">$</span> cmake .
第一次在父目錄 CMAKE_INSTALL_PREFIX=/usr
第一次在父目錄 MY_GLOBAL_VAR=777
子目錄,CMAKE_INSTALL_PREFIX=/usr
子目錄,MY_GLOBAL_VAR=777
第二次在父目錄 CMAKE_INSTALL_PREFIX=/usr
第二次在父目錄 MY_GLOBAL_VAR=777
第三次在父目錄 CMAKE_INSTALL_PREFIX=-->usr</code></span>

可以發現第一次在父目錄打印 CMAKE_INSTALL_PREFIX 和 MY_GOLBAL_VAR 時,他們的結果是上次cmake .後生成的值,存儲在 CMakeCache.txt 中,自己可以找到,解決方案就是可以把 CMakeCache.txt 文件刪除,然後在 cmake .我們以後在實際使用時要注意這個坑。對於修改 Cache 變量的另一種方式就是cmake -D CMAKE_INSTALL_PREFIX=/usr。可以自己驗證。這裏說一個重要的點,就是在終端中輸入的 cmake -D var=value . 如果 CMake 中默認有這個 var Cache 變量,那麼此時就是賦值,沒有的話,CMake 就會默認創建了一個全局 Cache 變量然後賦值。(tips: $CACHE{VAR}表示獲取 CACHE 緩存變量的值)。例子如下:(目錄結構同上)

根目錄 CMakeLists.txt :

<span style="color:#000000"><code><span style="color:#0000ff">cmake_minimum_required</span>(VERSION 3.10)
<span style="color:#0000ff">set</span>(MY_GLOBAL_VAR <span style="color:#a31515">"666"</span>)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第一次在父目錄 MY_GLOBAL_VAR=$CACHE{MY_GLOBAL_VAR}"</span>)
<span style="color:#0000ff">add_subdirectory</span>(src)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第二次在父目錄局部 MY_GLOBAL_VAR=${MY_GLOBAL_VAR}"</span>)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"第二次在父目錄全局 MY_GLOBAL_VAR=$CACHE{MY_GLOBAL_VAR}"</span>)</code></span>

src/CMakeLists.txt :

<span style="color:#000000"><code><span style="color:#0000ff">cmake_minimum_required</span>(VERSION 3.10)
<span style="color:#0000ff">message</span>(<span style="color:#a31515">"子目錄,MY_GLOBAL_VAR=${MY_GLOBAL_VAR}"</span>)
<span style="color:#0000ff">set</span>(MY_GLOBAL_VAR <span style="color:#a31515">"777"</span> CACHE <span style="color:#0000ff">STRING</span> INTERNAL FORCE )</code></span>

運行結果:

<span style="color:#000000"><code>第一次在父目錄 MY_GLOBAL_VAR=8
子目錄,MY_GLOBAL_VAR=666
第二次在父目錄局部 MY_GLOBAL_VAR=666
第二次在父目錄全局 MY_GLOBAL_VAR=777</code></span>

有了上面的基礎,相信這個例子很快能看明白。

參考:

1、https://stackoverflow.com/questions/31037882/whats-the-cmake-syntax-to-set-and-use-variables/31044116#31044116

2、https://stackoverflow.com/questions/3249459/for-the-cmake-include-command-what-is-the-difference-between-a-file-and-a-mod

3、https://cmake.org/cmake/help/v3.11/command/set.html#set

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章