日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

cmake使用总结(转)---工程主目录CMakeList文件编写

發(fā)布時(shí)間:2023/11/29 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cmake使用总结(转)---工程主目录CMakeList文件编写 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在linux 下進(jìn)行開(kāi)發(fā)很多人選擇編寫(xiě)makefile 文件進(jìn)行項(xiàng)目環(huán)境搭建,而makefile 文件依賴關(guān)系復(fù)雜,工作量很大,搞的人頭很大。采用自動(dòng)化的項(xiàng)目構(gòu)建工具cmake 可以將程序員從復(fù)雜的makefile 文件中解脫出來(lái)。cmake 根據(jù)內(nèi)置的規(guī)則和語(yǔ)法來(lái)自動(dòng)生成相關(guān)的makefile 文件進(jìn)行編譯,同時(shí)還支持靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的構(gòu)建,我把工作中用到的東東總結(jié)在此,方便忘記時(shí)隨時(shí)查看,具體cmake的介紹和詳細(xì)語(yǔ)法還是參考官方文檔(http://www.cmake.org/),有一篇中文的cmake 實(shí)踐 寫(xiě)的不錯(cuò),可以google一下。

???? 使用cmake 很簡(jiǎn)單,只需要執(zhí)行cmake, make 兩個(gè)命令即可,用我工作中的一個(gè)工程舉例說(shuō)明。

????? 假設(shè)當(dāng)前的項(xiàng)目代碼在src 目錄。 src 下有子目錄:server, utility, lib, bin, build

????? server -----? 存放項(xiàng)目的主功能類(lèi)文件

????? utility? -----? 存放項(xiàng)目要用到相關(guān)庫(kù)文件,便已成為庫(kù)文件存放到子目錄lib 中

????? lib ? ? ? -----? 存放utility 生成的庫(kù)

????? bin????? -----? 存放association 生成的二進(jìn)制文件

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

???

????? cmake 要求工程主目錄和所有存放源代碼子目錄下都要編寫(xiě)CMakeLists.txt 文件,注意大小寫(xiě)(cm 大寫(xiě),list中l(wèi) 大寫(xiě)且落下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 構(gòu)建過(guò)程會(huì)被終止。

????? PROJECT(server_project)???????????????????????????????????????????? #定義工程名稱(chēng)

????? MESSAGE(STATUS "Project: SERVER")?????????????? #打印相關(guān)消息消息
????? MESSAGE(STATUS "Project Directory: ${PROJECT_SOURCE_DIR}")

????? SET(CMAKE_BUILE_TYPE DEBUG)????????????????????? #指定編譯類(lèi)型


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

????? 相關(guān)解釋:

????? 1. CMakeLists.txt 文件中不區(qū)分大小寫(xiě)

????? 2. PROJECT(project_name)??? 定義工程名稱(chēng)

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

????????? 可以指定工程采用的語(yǔ)言,選項(xiàng)分別表示:C++, C, java, 如不指定默認(rèn)支持所有語(yǔ)言

????? 3. MESSAGE(STATUS, "Content")? 打印相關(guān)消息

????????? 輸出消息,供調(diào)試CMakeLists.txt 文件使用。

????? 4. SET(CMAKE_BUILE_TYPE DEBUG)? 設(shè)置編譯類(lèi)型debug 或者release。 debug 版會(huì)生成相關(guān)調(diào)試信息,可以使用GDB 進(jìn)行?

????????? 調(diào)試;release不會(huì)生成調(diào)試信息。當(dāng)無(wú)法進(jìn)行調(diào)試時(shí)查看此處是否設(shè)置為debug.

????? 5. SET(CMAKE_C_FLAGS_DEBUG "-g -Wall") 設(shè)置編譯器的類(lèi)型

????????? CMAKE_C_FLAGS_DEBUG ? ? ? ? ?? ----? C 編譯器

????????? CMAKE_CXX_FLAGS_DEBUG??????? ----? C++ 編譯器

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

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

?????? 如上便是工程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????????????????????????????????? #設(shè)置變量,表示所有的源文件
???? ConfigParser.cpp
???? StrUtility.cpp
???? )


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


??? LINK_DIRECTORIES(????????????????????????????????? #相關(guān)庫(kù)文件的目錄
??? /usr/local/lib

??? )


??? ADD_LIBRARY(association ${SOURCE_FILES})???????? #生成靜態(tài)鏈接庫(kù)libassociation.a

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

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

?

--------------------------------------------------------------------------------------------------------------------
??? 相關(guān)解釋:

??? 1. SET(SOURCE_FILES .....)??

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

??? 2. INCLUDE_DIRECTORY(...)??

??? include頭文件時(shí)搜索的所有目錄

??? 變量PROJECT_SOURCE_DIR 表示工程所在的路徑,系統(tǒng)默認(rèn)的變量

??? 3. LINK_DIRECTORIES(...)

???? 庫(kù)文件存放的目錄,在程序連接庫(kù)文件的時(shí)候要再這些目錄下尋找對(duì)應(yīng)的庫(kù)文件

??? 4. ADD_LIBRARY(...)?

???? 表示生成靜態(tài)鏈接庫(kù)libassociaiton.a,由${PROJECT_SOURCE_DIR}代表的文件生成。

???? 語(yǔ)法:ADD_LIBRARY(libname [SHARED|STATIC]

???? SHARED 表示生成動(dòng)態(tài)庫(kù), STATIC表示生成靜態(tài)庫(kù)。

??? 5. TARGET_LINK_LIBRARY(association core)?

???? 表示庫(kù)association 依賴core庫(kù)文件

???? 6. SET_TARGET_PROPERTIES

???? 設(shè)置編譯的庫(kù)文件存放的目錄,還可用于其他屬性的設(shè)置。如不指定,

???? 生成的執(zhí)行文件在當(dāng)前編譯目錄下的各子目錄下的build目錄下,好拗口!簡(jiǎn)單一點(diǎn):

???? 如指定在: ./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??? #表示生成的執(zhí)行文件所在路徑
???? RUNTIME_OUTPUT_DIRECTORY? "${PROJECT_SOURCE_DIR}/bin")

???? -------------------------------------------------------------------------------------------------------

???? 相關(guān)解釋:

???? 1. ADD_EXECUTABLE()???? #指定要生成的執(zhí)行文件的名稱(chēng)server

????? 其他用法同utilty/CMakeLists.txt

???? 2. SET_TARGET_PROPERTIES

????? 設(shè)置生成的執(zhí)行文件存放的路徑,

????? 注意:

????? 執(zhí)行文件server 依賴的子目錄utility 子目錄生成的靜態(tài)庫(kù)libutility.a,在指定的時(shí)候要寫(xiě)成:
??? ? TARGET_LINK_LIBRARIES(server?? utility)

????? 而不能寫(xiě)成:

????? TARGET_LINK_LIBRARIES(server?? libutility.a)

????? 否則編譯總會(huì)提示找不到libutility庫(kù)文件。

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

????? 這一點(diǎn)很詭異,暫時(shí)還沒(méi)找到原因。

?

????? 完成對(duì)應(yīng)的CMakeLists.txt 文件編寫(xiě)后,便可以進(jìn)行編譯了。

????? 編譯:

??????????? 進(jìn)入 ./src/build

??????????? 執(zhí)行cmake ..

??????????? make

?

?????? cmake 的使用很簡(jiǎn)單,更高級(jí)的應(yīng)用好比版本信息,打包,安裝等相關(guān)基本的應(yīng)用后面會(huì)一一介紹,

????? 復(fù)雜的語(yǔ)法使用要參考官方文檔。

總結(jié)

以上是生活随笔為你收集整理的cmake使用总结(转)---工程主目录CMakeList文件编写的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。