標籤:

cmake使用總結(轉)

cmake使用總結(轉)---工程主目錄CMakeList文件編寫

在linux 下進行開發很多人選擇編寫makefile 文件進行項目環境搭建,而makefile 文件依賴關係複雜,工作量很大,搞的人頭很大。採用自動化的項目構建工具cmake 可以將程序員從複雜的makefile 文件中解脫出來。cmake 根據內置的規則和語法來自動生成相關的makefile 文件進行編譯,同時還支持靜態庫和動態庫的構建,我把工作中用到的東東總結在此,方便忘記時隨時查看,具體cmake的介紹和詳細語法還是參考官方文檔(http://www.cmake.org/),有一篇中文的cmake 實踐寫的不錯,可以google一下。

使用cmake 很簡單,只需要執行cmake, make 兩個命令即可,用我工作中的一個工程舉例說明。

假設當前的項目代碼在src 目錄。 src 下有子目錄:server, utility, lib, bin, build

server ----- 存放項目的主功能類文件

utility ----- 存放項目要用到相關庫文件,便已成為庫文件存放到子目錄lib 中

lib ----- 存放utility 生成的庫

bin ----- 存放association 生成的二進位文件

build ----- 編譯目錄,存放編譯生成的中間文件

cmake 要求工程主目錄和所有存放源代碼子目錄下都要編寫CMakeLists.txt 文件,注意大小寫(cm 大寫,list中l 大寫且落下s).

src/CMakeLists.txt 文件如下:

-------------------------------------------------------------------------------------------------------------

#cmake file for project association#表示注釋 #author:>---double__song #created:>--2011/03/01 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)#cmake 最低版本要求,低於2.6 構建過程會被終止。 PROJECT(server_project)#定義工程名稱

MESSAGE(STATUS "Project: SERVER")#列印相關消息消息 MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}") SET(CMAKE_BUILE_TYPE DEBUG) #指定編譯類型

SET(CMAKE_C_FLAGS_DEBUG "-g -Wall")#指定編譯器 ADD_SUBDIRECTORY(utility)#添加子目錄 ADD_SUBDIRECTORY(server) -------------------------------------------------------------------------------------------------------------

相關解釋:

1. CMakeLists.txt 文件中不區分大小寫

2. PROJECT(project_name) 定義工程名稱

語法:project(projectname [cxx] [c] [java])

可以指定工程採用的語言,選項分別表示:C++, C, java, 如不指定默認支持所有語言

3. MESSAGE(STATUS, "Content") 列印相關消息

輸出消息,供調試CMakeLists.txt 文件使用。

4. SET(CMAKE_BUILE_TYPE DEBUG) 設置編譯類型debug 或者release。 debug 版會生成相關調試信息,可以使用GDB 進行

調試;release不會生成調試信息。當無法進行調試時查看此處是否設置為debug.

5. SET(CMAKE_C_FLAGS_DEBUG "-g -Wall") 設置編譯器的類型

CMAKE_C_FLAGS_DEBUG ---- C 編譯器

CMAKE_CXX_FLAGS_DEBUG ---- C++ 編譯器

6. ADD_SUBDIRECTORY(utility) 添加要編譯的子目錄

為工程主目錄下的存放源代碼的子目錄使用該命令,各子目錄出現的順序隨意。

如上便是工程server_project 主目錄src 下的CMakeLists.txt 文件,下一篇我們解釋子目錄utiltiy中的CMakeLists.txt 文件。

子目錄utility 下的CMakeLists.txt 文件如下:

-------------------------------------------------------------------------------------------------------------------- #Cmake file for library utility.a #Author: double__song #Created: 2011/3/3

SET(SOURCE_FILES #設置變數,表示所有的源文件 ConfigParser.cpp StrUtility.cpp )

INCLUDE_DIRECTORIES( #相關頭文件的目錄 /usr/local/include ${PROJET_SOURCE_DIR}/utility )

LINK_DIRECTORIES( #相關庫文件的目錄 /usr/local/lib

)

ADD_LIBRARY(association ${SOURCE_FILES}) #生成靜態鏈接庫libassociation.a

TARGET_LINK_LIBRARY(association core) #依賴的庫文件

SET_TARGET_PROPERTIES(utility PROPERTIES #表示生成的執行文件所在路徑 RUNTIME_OUTPUT_DIRECTORY> "${PROJECT_SOURCE_DIR}/lib")

-------------------------------------------------------------------------------------------------------------------- 相關解釋:

1. SET(SOURCE_FILES .....)

表示要編譯的源文件,所有的源文件都要羅列到此處。set 設置變數,變數名SOURCE_FILES自定義。

2. INCLUDE_DIRECTORY(...)

include頭文件時搜索的所有目錄

變數PROJECT_SOURCE_DIR 表示工程所在的路徑,系統默認的變數

3. LINK_DIRECTORIES(...)

庫文件存放的目錄,在程序連接庫文件的時候要再這些目錄下尋找對應的庫文件

4. ADD_LIBRARY(...)

表示生成靜態鏈接庫libassociaiton.a,由${PROJECT_SOURCE_DIR}代表的文件生成。

語法:ADD_LIBRARY(libname [SHARED|STATIC]

SHARED 表示生成動態庫, STATIC表示生成靜態庫。

5. TARGET_LINK_LIBRARY(association core)

表示庫association 依賴core庫文件

6. SET_TARGET_PROPERTIES

設置編譯的庫文件存放的目錄,還可用於其他屬性的設置。如不指定,

生成的執行文件在當前編譯目錄下的各子目錄下的build目錄下,好拗口!簡單一點:

如指定在: ./src/lib 下

不指定在: ./src/build/utility/build 目錄下

生成的中間文件在./src/build/utilty/build 目錄下,不受該命令額影響

子目錄server 下的CMakeLists.txt 文件:

-------------------------------------------------------------------------------------------- SET(SOURCE_FILES Gassociation.cpp ConfigurationHandler.cpp ) INCLUDE_DIRECTORIES(

/usr/local/include ${PROJECT_SOURCE_DIR}/utility ${PROJECT_SOURCE_DIR}/association ) LINK_LIBRARIES( /usr/local/lib ${PROJECT_SOURCE_DIR}/lib ) ADD_EXECUTABLE(server ${SOURCE_FILES}) TARGET_LINK_LIBRARIES(server utility

SET_TARGET_PROPERTIES(server PROPERTIES #表示生成的執行文件所在路徑 RUNTIME_OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}/bin")

-------------------------------------------------------------------------------------------------------

相關解釋:

1. ADD_EXECUTABLE() #指定要生成的執行文件的名稱server

其他用法同utilty/CMakeLists.txt

2. SET_TARGET_PROPERTIES

設置生成的執行文件存放的路徑,

注意:

執行文件server 依賴的子目錄utility 子目錄生成的靜態庫libutility.a,在指定的時候要寫成: TARGET_LINK_LIBRARIES(server utility)

而不能寫成:

TARGET_LINK_LIBRARIES(server libutility.a)

否則編譯總會提示找不到libutility庫文件。

但使用第三方的庫卻要指定成具體的庫名,如:libACE-6.0.0.so

這一點很詭異,暫時還沒找到原因。

完成對應的CMakeLists.txt 文件編寫後,便可以進行編譯了。

編譯:

進入 ./src/build

執行cmake ..

make

cmake 的使用很簡單,更高級的應用好比版本信息,打包,安裝等相關基本的應用後面會一一介紹,

複雜的語法使用要參考官方文檔。

推薦閱讀:

??哪個神人總結的段子?也太有才了!
課題結題總結報告範例
(652)陳益峰:風水常見的煞氣總結(三)
EXPMA總結

TAG:總結 | make |