因爲我在編輯CMakeLists.txt後使用cmake,所以一些變量不會被加載。如果我用CACHE STRING定義了某些內容,它不會讓我在不強制它或刪除緩存的情況下對其進行更改。什麼是CMakeCache.txt及其覆蓋我的變量的原因
那麼爲什麼我們有這個CMakeCache.txt文件。它甚至需要嗎?
因爲我在編輯CMakeLists.txt後使用cmake,所以一些變量不會被加載。如果我用CACHE STRING定義了某些內容,它不會讓我在不強制它或刪除緩存的情況下對其進行更改。什麼是CMakeCache.txt及其覆蓋我的變量的原因
那麼爲什麼我們有這個CMakeCache.txt文件。它甚至需要嗎?
是的,這當然是需要的。 CMake在構建期間重新運行時使用緩存,因爲CMakeList文件已更改,或者當您使用make rebuild_cache
時。它還會在正常配置運行開始時加載緩存。
使用CMake的是如下所述的標準worflow:
ccmake
或類似的初始版本,檢查緩存變量由初始運行設置,並根據需要進行修改。你現在有根據自己的口味配置編譯系統。
對於上述工作,緩存中的用戶更改必須優先於CMakeLists.txt中指定的默認緩存值。否則,在下一次配置時,從點2開始的用戶更改將丟失,並重新由項目指定的默認值覆蓋。
這就是爲什麼CMake命令set(var ... CACHE)
不修改高速緩存變量var
(如果它已存在)。通常,您的項目應該將緩存設置爲提供用戶可調整的默認設置。
如果你真的需要覆蓋的用戶選擇在你的項目,你可以:
FORCE
到set
命令,或set
沒有CACHE
設置非緩存變量。非緩存變量優先於相同名稱的緩存變量。最後但並非最不重要的一點,[load_cache](https://cmake.org/cmake/help/v3.4/command/load_cache.html?highlight=load_cache)命令加載來自另一個項目的CMake緩存的值。 –
激勵例如
這基本上是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
有關詳細信息請參閱[設置和使用變量的CMake語法是什麼?](https://stackoverflow.com/questions/31037882/whats-the-cmake-syntax-to-set-and-use-variables)。 – Florian