cmake學習筆記

來源:互聯網
上載者:User

標籤:blog   http   os   檔案   io   for   

CMake是幹嘛的,我不詳說。我只知道,我寫一個程式要將多個檔案組織起來並編譯。從頭寫一個MakeFile太麻煩。CMake設定檔比MakeFile要簡單很多。
從原理上講,CMake只是在協助我們自動產生MakeFile而己。我們編譯器還是要make一下的。

我寫了一個簡單的樣本,內容我們不需要關心,只關心其檔案結構就行了。如下:
.
|-- CMakeLists.txt
|-- main.cpp
`-- person
    |-- CMakeLists.txt
    |-- person.cpp
    `-- person.h

在./目錄與 person/都添加了一個CMakeLists.txt檔案。

如下./CMakeLists.txt檔案:

cmake_minimum_required(VERSION 3.0)project(StudyCmake CXX)message(STATUS "project source: " ${PROJECT_SOURCE_DIR})message(STATUS "project binary: " ${PROJECT_BINARY_DIR})add_subdirectory(person)include_directories(person)#set (main_src main.cpp)aux_source_directory(. main_src)message(STATUS "Source files : " ${main_src})add_executable(StudyCmake ${main_src})target_link_libraries(StudyCmake person)set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)message(STATUS "executable output path: " ${EXECUTABLE_OUTPUT_PATH})

第1行:cmake_minimum_required(VERSION 3.0),這個最好有,表示版本資訊。

第2行:project(StudyCmake CXX),註明工程名稱與編譯的語言。CXX表示C++,C表示C。還有別的語言可選。這行語句的執行,會產生兩個變數:
    > PROJECT_SOURCE_DIR    工程源碼路徑
    > PROJECT_BINARY_DIR    產生的可執行檔路徑

第3-4行:message(STATUS "project source" ${PROJECT_SOURCE_DIR},這是一條資訊列印語句。當cmake執行到這一句,會向終端輸出相應的資訊。這種資訊分幾種,這裡是STATUS表示是狀態資訊,除了這個還有:
    > SEND_ERROR    產生錯誤,產生過程被跳過
    > FATAL_ERROR    立即終止cmake

取變數的值是${變數名},如:${PROJECT_SOURCE_DIR}。
在CMakeLists.txt裡,變數名是區分大小寫,但命令不分大小寫。如message與MESSAGE是等價的。但STATUS不等價於status。

第5行:add_subdirectory(person),cmake執行到這句時,就會跳入./person目錄,讀取person目錄下的CMakeLists.txt檔案。./person/CMakeLists.txt檔案稍候再講解。


這裡,跟隨cmake的執行過程,開啟./person/CMakeLists.txt:

aux_source_directory(. person_src)message(STATUS "Print files : " ${person_src})add_library(person ${person_src})

這個檔案裡的出現一個新的命令:add_library(person ${person_src}),添加了一靜態庫person,由${person_src}產生。而person_src變數就是./person/目錄下所有的源檔案。

好回到主目標下的CMakeLists.txt檔案:

第6行:include_directories(person),將./person加入標頭檔搜尋路徑。這樣以來,在main.cpp檔案裡include "person.h"就不需要寫成#include "person/person.h"了。

第7行:set(main_src main.cpp),將main_src變數設定為"main.cpp"。上面這條命令前加了#,表示注釋了。CMakeLists.txt裡的注釋與Shell裡的注釋類似。

第8行:aux_source_directory(. main_src),將.目錄下所有的源檔案名稱賦給main_src。這句命令與set(main_src main.cpp)是等價了。只不過aux_source_directory命令是通過去查目錄所得,而set得寫明。

第10行:add_executable(StudyCmake ${main_src}),添加一個可執行檔輸出。由${make_src}產生StudyCmake可執行程式。這語話並不是以cmake執行的時候就完成可執行檔的產生,而是說我們要產生這麼一個可執行檔。

第11行:target_link_libraries(StudyCmake person),設定連結,將person與StudyCmake目標一起連結。person是靜態庫目標。

好!關於CMakeLists.txt的內容就講完了。下面我們在cmake一下。
通常,我們不會在源碼目錄下直接執行cmake,而是在源碼目錄下建一個build目錄。然後進入這個目錄,再執行cmake ..

$ mkdir build$ cd build/$ cmake ..-- The CXX compiler identification is GNU 4.4.7-- Check for working CXX compiler: /usr/bin/c++-- Check for working CXX compiler: /usr/bin/c++ -- works-- Detecting CXX compiler ABI info-- Detecting CXX compiler ABI info - done-- project source: /home/hevake_lcj/Workspace/C++/StudyCMake-- project binary: /home/hevake_lcj/Workspace/C++/StudyCMake/build-- Print files : ./person.cpp-- Source files : ./main.cpp-- executable output path: /home/hevake_lcj/Workspace/C++/StudyCMake/build/bin-- Configuring done-- Generating done-- Build files have been written to: /home/hevake_lcj/Workspace/C++/StudyCMake/build

cmake在執行過程中,不是立限就產生什麼檔案,而是通過解釋上面的CMakeLists.txt檔案裡的命令來讀取我們的意圖。解釋完之後,cmake才真正知道我們想到它做什麼。最後才根據我們的意圖產生對應的MakeFile與相關的目錄層次。

cmake執行完之後,在build目錄下就會產生很多檔案,其中最主要的是產生了MakeFile。

前面我也說了cmake只不過是協助我們產生MakeFile而己,真正的編譯還得make一下才行。那就make一下好了。

$ makeScanning dependencies of target person[ 50%] Building CXX object person/CMakeFiles/person.dir/person.cpp.oLinking CXX static library libperson.a[ 50%] Built target personScanning dependencies of target StudyCmake[100%] Building CXX object CMakeFiles/StudyCmake.dir/main.cpp.oLinking CXX executable bin/StudyCmake[100%] Built target StudyCmake

好了,我就先學到這裡,相信日常的實用還是夠用了。不夠用的時候再學。

更多技能請參考:http://my.oschina.net/chen0dgax/blog/151894

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.