使用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(associationcore) #依賴的庫文件
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(serverPROPERTIES #表示生成的執行文件所在路徑
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(serverlibutility.a)
否則編譯總會提示找不到libutility庫文件。
但使用第三方的庫卻要指定成具體的庫名,如:libACE-6.0.0.so
這一點很詭異,暫時還沒找到原因。
完成對應的CMakeLists.txt文件編寫後,便可以進行編譯了。
編譯:
進入./src/build
執行cmake..
make
cmake的使用很簡單,更高級的應用好比版本信息,打包,安裝等相關基本的應用後面會一一介紹,
複雜的語法使用要參考官方文檔。