2017-02-10 3534 views
6

因爲我在編輯CMakeLists.txt後使用cmake,所以一些變量不會被加載。如果我用CACHE STRING定義了某些內容,它不會讓我在不強制它或刪除緩存的情況下對其進行更改。什麼是CMakeCache.txt及其覆蓋我的變量的原因

那麼爲什麼我們有這個CMakeCache.txt文件。它甚至需要嗎?

+1

有關詳細信息請參閱[設置和使用變量的CMake語法是什麼?](https://stackoverflow.com/questions/31037882/whats-the-cmake-syntax-to-set-and-use-variables)。 – Florian

回答

8

是的,這當然是需要的。 CMake在構建期間重新運行時使用緩存,因爲CMakeList文件已更改,或者當您使用make rebuild_cache時。它還會在正常配置運行開始時加載緩存。

使用CMake的是如下所述的標準worflow:

  1. 運行cmake在一個空的二進制目錄生成項目&緩存
  2. 在CMake的GUI或ccmake或類似的初始版本,檢查緩存變量由初始運行設置,並根據需要進行修改。
  3. 重新運行CMake(或者如果你的用戶界面提供的話,只是其配置步驟)。
  4. 重複步驟2 & 3,直到你滿意的配置
  5. 如果你只在3運行的配置,運行生成

你現在有根據自己的口味配置編譯系統。

對於上述工作,緩存中的用戶更改必須優先於CMakeLists.txt中指定的默認緩存值。否則,在下一次配置時,從點2開始的用戶更改將丟失,並重新由項目指定的默認值覆蓋。

這就是爲什麼CMake命令set(var ... CACHE)不修改高速緩存變量var(如果它已存在)。通常,您的項目應該將緩存設置爲提供用戶可調整的默認設置。

如果你真的需要覆蓋的用戶選擇在你的項目,你可以:

  • 添加FORCEset命令,或
  • 使用set沒有CACHE設置非緩存變量。非緩存變量優先於相同名稱的緩存變量。
+0

最後但並非最不重要的一點,[load_cache](https://cmake.org/cmake/help/v3.4/command/load_cache.html?highlight=load_cache)命令加載來自另一個項目的CMake緩存的值。 –

1

激勵例如

這基本上是https://stackoverflow.com/a/42160304/895245提到什麼,但有一個更明顯的例子,使其更容易理解。

考慮這種使用情況:

git clone project 
cd project 
# Options dfined with "option(" in CMakeLists.txt. 
cmake -DOPT1=ON -DOPT2=OFF -DOPT3=ON . 
make 
# Create bugs (edit code). 
make 

然後,幾天後,一個新的目錄添加到項目中。

這意味着CMakeLists.txt更改爲新的add_subdirectory,因此我們必須再次運行cmake以更新我們的make文件。

如果我們沒有CMakeCache.txt,我們必須記住並重新輸入所有選項:

git pull 
cmake -DOPT1=ON -DOPT2=OFF -DOPT3=ON . 
make 

但由於緩存的,我們可以這樣做:

cmake . 
make