轉載自個人博客:CMake 簡介和 CMake 模板。html
若是你用 Linux 操做系統,使用 cmake 會簡單不少,能夠參考一個很好的教程:CMake 入門實戰 | HaHack。若是你用 Linux 操做系統,並且只是運行一些小程序,能夠看看個人另外一篇博客:你就編譯一個 cpp,用 CMake 還不如用 pkg-config 呢。git
但若是你用 Windows,很大的可能你會使用圖形界面的 CMake(cmake-gui.exe)和 Visual Studio。本文先簡單介紹使用 CMake + Visual Studio 的使用流程,而後以幾個例子介紹 CMake 相關知識。github
若是你還沒安裝 cmake,下載 https://cmake.org/files/v3.6/cmake-3.6.0-win64-x64.msi(15 MB)安裝它。若是你還沒裝 VS,推薦使用 VS2015 社區版本,到 這裏 下載,選擇那個 3.7 GB 的。由於一次下載好,安裝起來很省心。若是你已經有了 VS2010 或者 VS2013,也能夠不安裝 VS2015。小程序
下載第一份源碼 cpp.zip(1.16 KB)。解壓進入文件夾,打開 cmake-gui,把源碼和 cmake-gui 界面對半放。以下圖:windows
而後,app
把源碼根目錄的 CMakeLists.txt 拖動到 cmake-gui 界面上ide
修改輸出目錄(我一般都是添加 /build
)post
點擊 configure(配置),選擇【Visual Studio 14 VS2015 Win64】,點擊肯定^[「Win64」是指的是編譯 VS2015 x64 工程,沒有「Win64」則爲 x86 工程)。]visual-studio
點擊 generate(生成)測試
最後,到輸出目錄,用 VS2015 打開 CPP.sln
工程。在 Solution Explorer 中右鍵單擊 CPP,而後【Set as StartUp Project】,而後 Ctrl+F5 運行。
相信你已經看到了程序運行結果,大概以下:
0^2 ---> 0 0^2 ---> 0 2^2 ---> 4 3^2 ---> 9 4^2 ---> 16
使用 CMake 的好處是,它能夠生成 VS 工程,也能夠生成 Linux 系統下經常使用的 Makefile工程,甚至還能夠用 Qt creator 打開 CMakeLists.txt 文件,而後生成 qt 工程。^參考個人教程:[HOWTO: Use Qt creator to Open CMakeLists.txt directly (will generate proper project files) · Issue #5 · district10/cmake-templates,裏面包含一個 Linux 上的例子,一個 Windows 上的例子。]這份代碼,在 Linux 上也能夠迅速跑起來,這是我虛擬機中運行的截圖:
本小節源碼:cmake-templates/cpp at master · district10/cmake-templates。
咱們從根目錄的 CMakeLists.txt 看起,它簡潔到只有 4 行!以下:
project( CPP ) cmake_minimum_required( VERSION 2.6 ) file( GLOB SRCS *.c *.cpp *.cc *.h *.hpp ) add_executable( ${PROJECT_NAME} ${SRCS} )
咱們一行一行看,
第一行,設置了工程名稱,叫「CPP」(因此後來生成的 VS 工程名爲 CPP.sln
);
第二行,設置了 CMake 最低版本號,一般在根目錄的 CMakeLists.txt 添加這個指定;
第三行,把當前文件夾下的源碼列表(文件後綴匹配的那些文件)存到變量 SRCS 中;
第四行,把源碼編譯成一個二進制這裏的 ${PROJECT_NAME}
就是 CPP
,是在第一行設置的。
這就是一個基本的用 CMake 組織的 C++ 程序。只要四行配置,利用 CMake,咱們就生成了 Windows 下的 VS 工程,還生成了 Linux 下的 Makefile 工程。只要四行!
固然還能夠生成多個二進制,若是你有多份源碼,好比
add_executable( foo foo.cpp ) add_executable( bar bar.cpp )
若是上面沒問題,仍是這兩個代碼,咱們在 CMakeLists.txt 裏去掉上面兩行,改爲 add_executable( foobar foo.cpp bar.cpp )
{.cmake},會不會有什麼問題?
本小節源碼:cmake-templates/modules at master · district10/cmake-templates。
還能夠用 CMake 生成連接庫,能夠是靜態庫(.lib
),也能夠是動態庫(.dll
),語法以下:
add_library( 動態連接庫名稱 SHARED 源碼列表 ) add_library( 靜態連接庫名稱 STATIC 源碼列表 )
若是不指定 SHARED 或是 STATIC,默認生成的是 STATIC,這個例子裏,src 文件夾下生成了 3 個連接庫,LibCubic 是「指定」生成的靜態庫,LibExtras 是「指定」生成的動態庫,LibSquare 是「默認」生成的靜態庫。
生成庫文件就是爲了讓人用,因此咱們要把它連接給某個二進制,語法以下:
add_executable( 二進制名 源碼列表 ) target_link_libraries( 二進制名 動靜態庫名 )
生成庫的源碼有什麼最基本的要求嗎?若是 add_executable( baz baz.cpp b.cpp a.cpp z.cpp )
{.cmake} 能夠正確地生成二進制文件 baz(windows 上就是 baz.exe),那這行 CMake 配置能夠修改成 add_library( baz baz.cpp b.cpp a.cpp z.cpp )
{.cmake} 嗎?爲何。
本小節源碼:cmake-templates/opencv3 at master · district10/cmake-templates。
CMake 的一個方便之處,即是添加第三方庫。在個人 CMake 安裝目錄(C:\Program Files\CMake\share\cmake-3.6\Modules
)下,有多達 145 個 FindX.cmake 文件,好比FindQt4.cmake
。當你在本身源碼中使用 find_package( Qt4 )
時,CMake 就會嘗試去引入 FindQt4.cmake
,這個文件引入後,特定的變量裏就存儲了頭文件地址(include_directories
)、連接庫地址(link_directories
)、連接庫的名稱以及一些開關配置(options)。
本節用 OpenCV 來講明如何連接使用第三方庫,這裏用的是 opencv3。OpenCV3 官網提供的只有 VS2013 (vc12) 和 VS2015 (vc14) 的 prebuild,若是你使用 VS2012,你只能使用 OpenCV2(或者你要本身編譯 OpenCV3?)。OpenCV 的配置能夠參考我寫得教程:HOWTO: OpenCV 2 & OpenCV 3 · Issue #4 · district10/cmake-templates。
本節源碼的 CMakeLists.txt 裏,我沒有使用 find_package( OpenCV REQUIRED )
,而是使用了include( $ENV{OpenCV3_DIR}/OpenCVConfig.cmake )
,由於我以爲這是一種更好的解決方案,如此一來,你只要設置環境變量(%OpenCV3_DIR%),添加相應目錄到 %PATH%,即可以同時使用 OpenCV2 和 OpenCV3(固然是在不一樣的項目中)。上面的源碼連接中對此也有簡要說明。
看看咱們的 CMakeLists.txt:
project( OPENCV3 ) cmake_minimum_required( VERSION 2.8 ) # find_package( OpenCV REQUIRED ) # 不使用 find_package include( $ENV{OpenCV3_DIR}/OpenCVConfig.cmake ) # 直接引入 cmake 文件 message( STATUS "OpenCV library status:" ) # 輸出一下獲得的變量 message( STATUS " version: ${OpenCV_VERSION}" ) message( STATUS " libraries: ${OpenCV_LIBS}" ) message( STATUS " include path: ${OpenCV_INCLUDE_DIRS}" ) include_directories( ${OpenCV_INCLUDE_DIRS} ) # 引入 OpenCV 頭文件目錄 add_executable( ${PROJECT_NAME} example.cpp ) target_link_libraries( ${PROJECT_NAME} ${OpenCV_LIBS} ) # exe 連接 OpenCV
在個人系統下,輸出以下(我調整了換行):
OpenCV ARCH: x64 OpenCV RUNTIME: vc14 OpenCV STATIC: ON Found OpenCV 3.1.0 in C:/OpenCV/opencv3/build/x64/vc14/lib You might need to add C:\OpenCV\opencv3\build\x64\vc14\bin to your PATH to be able to run your applications. OpenCV library status: version: 3.1.0 libraries: opencv_world;opencv_videostab;opencv_videoio;opencv_video; opencv_superres;opencv_stitching;opencv_shape;opencv_photo; opencv_objdetect;opencv_ml;opencv_imgproc;opencv_imgcodecs; opencv_highgui;opencv_flann;opencv_features2d;opencv_core;opencv_calib3d include path: C:/OpenCV/opencv3/build/include;C:/OpenCV/opencv3/build/include/opencv Configuring done
很容易地,程序也運行起來了。
只要掌握上面那基本的幾點(通俗地說,就是生成 exe、lib、dll,連接 lib、dll,引入第三方庫),而後積攢一些別人的 CMakeLists.txt 片斷,CMake 便不難了。
若是你還以爲 CMake 很麻煩,那必定是我博客寫得很差。若是你以爲 CMake 很差用,那不是個人錯,那是 CMake 的官方教程太垃圾致使的,我反正歷來沒見過如此晦澀,一個例子都不給的教程。當時寫 https://github.com/district10/cmake-templates/blob/master/qt4-project/CMakeLists.txt 的時候,我但是深受其苦。
寫起來雖難,但用起來方便,因此……我大讚 CMake。
想對 CMake 有更多的瞭解,能夠參考個人 district10/cmake-templates: Some CMake Templates. Qt, Boost, OpenCV, C++11, etc.,裏面有簡單的 C 工程,C++ 工程,C++11 工程,Boost 庫的配置,OpenCV二、OpenCV3 的配置,Qt四、Qt5 的配置,等等。代碼在大多在 Windows + VS2010/VS2015 和 Linux + GCC4.8 測試經過。
我還寫了一些庫的配置,不一樣平臺不一樣 IDE、編譯器上有關 CMake 使用的教程:Issues · district10/cmake-templates。