在編譯程式的時候,會設定一些組態(configuration,簡稱 config)。
這些組態包含我們的編譯過程需要用哪一種編譯器,哪一些函式庫,要編譯哪些檔案和編譯的指令等等。
以 Linux 環境而言(Windows 系統的操作也大同小異,原理都是一樣的),在編譯 C++ 專案時,上述這些組態可以寫在一個叫做 Makefile 的檔案裡。在 Makefile 檔案所在資料夾執行 make 指令,make 這隻程式,就會吃進 Makefile 並根據 Makefile 內的組態設定做出對應編譯的動作。
通常這個 Makefile 寫起來很繁瑣,因此才會有 cmake 這個工具的誕生。
CMake 是一個能自動幫我們產生 Makefile 的程式。
CMake 基本的觀念就是,我們只要指定好編譯器種類,以及我們要編譯的目錄、執行檔名稱等等設定,CMake 就會產生 Makefile。
CMake 基本使用方式,假如我們有個資料夾結構如下:
src 資料夾裡面放 .cpp 程式碼。
lib 資料夾放程式碼用到的外部函式庫,即 include 的 header file。
而程式碼編譯成執行檔的動作,則在 build 資料夾內操作。
reference 資料夾內則放一些參考資料跟文件。
build 資料夾內有個 CMakeLists.txt,這個檔案就是 cmake 指令需要的檔案,以這個專案資料夾結構為例,CMakeLists.txt 內容可以這樣寫:
然後在 build 資料夾內執行:
接著執行:
[ 50%] Building CXX object CMakeFiles/meffect.dir/src/meffect.cpp.o
[100%] Linking CXX executable meffect
[100%] Built target meffect
然後就可以在 build 資料夾內找到程式的執行檔了。
注意:
cmake 會產生一些中間檔案,在 build 資料夾內執行 cmake 後,這些中間檔就會產生在 build 資料夾內。cmake 沒有 clean 指令,因此若 cmake 指令有些錯誤或問題的話,要刪除 cmake 產生的這些殘留檔案,必須將整個 build 資料夾砍掉再新增一個新的 build 資料夾。修好 CMakeLists.txt 後,再重新執行 cmake 一次。
為了避免 CMakeLists.txt 不小心被砍掉,我會將 CMakeLists.txt 放在專案第一層的資料夾內,如上述 hierarchy 所示。
Reference: 這個討論串
這些組態包含我們的編譯過程需要用哪一種編譯器,哪一些函式庫,要編譯哪些檔案和編譯的指令等等。
以 Linux 環境而言(Windows 系統的操作也大同小異,原理都是一樣的),在編譯 C++ 專案時,上述這些組態可以寫在一個叫做 Makefile 的檔案裡。在 Makefile 檔案所在資料夾執行 make 指令,make 這隻程式,就會吃進 Makefile 並根據 Makefile 內的組態設定做出對應編譯的動作。
通常這個 Makefile 寫起來很繁瑣,因此才會有 cmake 這個工具的誕生。
CMake 是一個能自動幫我們產生 Makefile 的程式。
CMake 基本的觀念就是,我們只要指定好編譯器種類,以及我們要編譯的目錄、執行檔名稱等等設定,CMake 就會產生 Makefile。
CMake 基本使用方式,假如我們有個資料夾結構如下:
. ├── build ├── CMakeLists.txt ├── lib ├── reference │ └── matrix_effect.cpp └── src └── meffect.cpp這種資料夾結構是我習慣的 hierarchy。用這樣的資料夾做管理,專案比較不會凌亂。
src 資料夾裡面放 .cpp 程式碼。
lib 資料夾放程式碼用到的外部函式庫,即 include 的 header file。
而程式碼編譯成執行檔的動作,則在 build 資料夾內操作。
reference 資料夾內則放一些參考資料跟文件。
build 資料夾內有個 CMakeLists.txt,這個檔案就是 cmake 指令需要的檔案,以這個專案資料夾結構為例,CMakeLists.txt 內容可以這樣寫:
cmake_minimum_required(VERSION 2.8.9) project(meffect) include_directories(lib) file(GLOB SOURCES "src/*.cpp") add_executable(meffect ${SOURCES})
然後在 build 資料夾內執行:
cmake ..如果順利的話,會出現 Configuring done 和 Generating done 訊息。
接著執行:
make這個指令會開始編譯程式碼,編譯成功會顯示:
[ 50%] Building CXX object CMakeFiles/meffect.dir/src/meffect.cpp.o
[100%] Linking CXX executable meffect
[100%] Built target meffect
然後就可以在 build 資料夾內找到程式的執行檔了。
注意:
cmake 會產生一些中間檔案,在 build 資料夾內執行 cmake 後,這些中間檔就會產生在 build 資料夾內。cmake 沒有 clean 指令,因此若 cmake 指令有些錯誤或問題的話,要刪除 cmake 產生的這些殘留檔案,必須將整個 build 資料夾砍掉再新增一個新的 build 資料夾。修好 CMakeLists.txt 後,再重新執行 cmake 一次。
為了避免 CMakeLists.txt 不小心被砍掉,我會將 CMakeLists.txt 放在專案第一層的資料夾內,如上述 hierarchy 所示。
Reference: 這個討論串
留言
張貼留言