標籤: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