作爲一個linux後現代程序員,對於遠古時代的自動化構建工具make很是敬畏,但卻真的沒有那麼大的勇氣去寫makefile,特別是當項目比較大的時,僅僅是寫makefile就會把好端端的一個人搞殘搞廢。還好,同樣有此體會的牛人們搞出了cmake,這樣一來,makefile不用自己親手寫了,它也可以被自動生成了,而生成它的cmake則要簡單的多。
一、從最簡單的開始
假如我們用CMake來管理經典的"Hello world"程序,只有一個main.c文件;那麼這樣用CMake來管理它。
1.在main.c的同文件夾下創建文件CMakeLists.txt,並編輯。內容如下
cmake_minimum_required(VERSION 2.6)
project(Hello)
set(SRC_LIST main.c)
add_executable(main ${SRC_LIST})
2.在當前目錄下運行cmake .
3.在當前目錄下運行make
完成了上述步驟,在當前目錄下就會生成可執行文件main和其他的CMake文件(這種文件會超級多)。
二、管理一個工程
如果不是小玩,而是想玩點大的,比如一個工程,那麼也是可以的。現在我們就來看看CMake是如何玩轉一個工程的。
1.下圖是我的工程目錄結構圖
bin是用來放編譯好的可執行文件
build是編譯目錄
CMakeLists.txt是工程頂層cmake規則文件
include存放項目所使用的頭文件
lib存放編譯好的庫文件
src存放項目源代碼
2.頂層CMakeLists.txt文件的內容
cmake_minimum_required(VERSION 3.6)
project(TASK)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#set(CMAKE_RUNTIME_DIR ${CMAKE_BINARY_DIR})
set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR})
include_directories(${CMAKE_SOURCE_DIR}/include)
link_directories(${CMAKE_SOURCE_DIR}/lib)
add_subdirectory(src)
3.我的項目源代碼文件src結構
CMakeLists.txt是src目錄下的cmake規則文件
main.c是項目主文件
sharememory是產生共享內存庫文件的源代碼文件
signal是產生信號量庫文件的源代碼文件
task是產生任務文件庫文件的源代碼文件
看看CMakeLists.txt文件的內容
set(SRC_LIST main.c)
add_subdirectory(task)
add_executable(main ${SRC_LIST})
target_link_libraries(main task)
install(TARGETS main RUNTIME DESTINATION bin)
對install命令稍作說明:
TARGETS後緊跟被安裝文件的名字,
RUNTIME被安裝文件類型是可執行程序
ARCHIVE被安裝文件類型是靜態鏈接庫
SHARED被安裝文件類型是動態鏈接庫
DESTINATION被安裝文件路徑(這裏只寫了相對路徑,是因爲在頂層CMakeLists.txt文件中設置了安裝文件的路徑前綴)。
4.庫文件task文件結構圖
CMakeLists.txt是task文件下的cmake規則文件
task.c是庫文件源代碼
看看CMakeLists.txt內容
set(SRC_LIST task.c)
add_library(task STATIC ${SRC_LIST})
install(TARGETS task ARCHIVE DESTINATION ${CMAKE_SOURCE_DIR}/lib)
命令add_library生活動態庫,STATIC說明生成庫類型是靜態類型,若要生成動態鏈接庫使用SHARED
5.編譯工程
進入工程的builid目下,運行cmake ..
在運行make
這樣我們就可以在bin目錄裏看到生活的可執行文件,在lib目錄裏看到生成的庫文件
需要說明的是,上面在build目錄中編譯的方式稱作外部編譯,而第一節講的在項目根目錄下編譯的那種方式稱爲內部編譯。
內部編譯的壞處就是會在項目根目錄產生非常多的對我們來說沒有用的文件,這個是非常不爽的,所以通常使用外部外部編譯
,將產生的文件扔進一個目錄裏。
三、CMake變量簡要說明