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 的使用很簡單,更高級的應用好比版本信息,打包,安裝等相關基本的應用后面會一一介紹,
????? 復雜的語法使用要參考官方文檔。
總結
以上是生活随笔為你收集整理的cmake使用总结(转)---工程主目录CMakeList文件编写的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到车祸打什么奖
- 下一篇: [转]使用Navicat for Ora