CMakeList 編寫規則 -1

来源:http://www.cnblogs.com/flyinggod/archive/2017/11/08/7805587.html
-Advertisement-
Play Games

Makefilen內容1. 顯示規則:顯示規則說明瞭,如何生成一個或多個目標。這是由Makefile指出要生成的文件和文件依賴的文件。2. 隱晦規則:基於Makefile的自動推導功能3. 變數的定義:一般是字元串4. 文件指示:一般是在Makefile中引用另外一個makefile文件;根據某些規 ...


 

Makefilen內容
1. 顯示規則:顯示規則說明瞭,如何生成一個或多個目標。這是由Makefile指出要生成的文件和文件依賴的文件。
2. 隱晦規則:基於Makefile的自動推導功能
3. 變數的定義:一般是字元串
4. 文件指示:一般是在Makefile中引用另外一個makefile文件;根據某些規則指定Makefile中有效的部分;多行
5. 註釋:#指示註釋

 

#常用變數
$@ ---目標文件
$^ ---所有依賴文件
$< ---第一個依賴文件
.PHONY ---偽目標文件

 

#常見指令

CMAKE_MINIMUM_REQUIRED(VERSION major[.minor[.patch[.tweak]]] [FATAL_ERROR]) 聲明Cmake版本,如果低於指定版本則會停止處理工程文件,並報告錯誤

PROJECT(PROJECTNAME [CXX] [C] [指定工程支持的語言,如果忽略,表示支持所有語言])

ADD_EXECUTABLE([WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 ...)引入一個名為的可執行目標,該目標會由調用該命令時在源文件列表中指定的源文件來構建。對應於邏輯目標名字,並且在工程範圍內必須是全局唯一的

如果構成可執行文件的源文件很多,則最好在MakeFiles中一樣指定一個源文件列表

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
PROJECT(Hello)

SET (SRC_LIST main.cpp v4l2_util.cpp tran_data.cpp)
MESSAGE(${SRC_LIST})
ADD_EXECUTABLE(Hello ${SRC_LIST})

ADD_EXECUTABLE:可執行程式由哪些.o文件生成

#編譯靜態庫,並讓主程式調用靜態庫最終生成一個可執行程式

即先生成一個hello.a,再讓主程式main.cpp使用libhello.a,最終生成Hello

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
PROJECT(Hello)

SET(LIB_SRC_LIST source1.cpp  source2.cpp)

SET(EXEC_SRC_LIST main.cpp)

ADD_LIBRARY(LIB STATIC ${LIB_SRC_LIST})

ADD_EXECUTABLE(Test_Hello ${EXEC_SRC_LIST})

TARGET_LINK_LIBRARIES(Test_Hello LIB)

ADD_LIBRARY(NAME [STATIC| SHARED|MODULE] [EXCLUDE_FROM_ALL] source1, source2,...)

創建一個名字name的庫文件,SHARED STATIC 制定生成庫的類型

TARGET_LINK_LIBRARIES(target [item1 [item2] [ ...] ]),將給定的庫鏈接到target上

#指定include路徑

一般情況下,src和include為同級目錄,需要指定include路徑src才可以正確定位頭文件

SET(INCLUDE_DIRECTORIES " ../include")

INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES})

#添加第三方庫,不需要編譯,將他放在resource目錄下,需要指定搜索庫路徑

SET(LINK_DIR "../../resource")

LINK_DIRECTORIES(${LINK_DIR })

LINK_DIRECTORIES(${LINK_DIR }): 指定連接器查找庫路徑

#創建Release和Debug版本

SET(CMAKE_BUILD_TYPE Release)

SET(CMAKE_BUILD_TYPE Debug)

指定二者模式區別在於

Release: -O3 -DNDEBUG

Debug: -g

也可不加在MakeFiles.txt裡面,在產生Makefiles時候才加入

cmake -DCMAKE_BUILD_TYPE=Release

#增加編譯和鏈接選項

CMAKE_C_FLAGS

CMAKE_CXX_FLAGS

CMAKE_EXE_LINKER_FLAGS

分別相當於:CFLAGS, CXXFLAGS, LDFLAGS。

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEMBED")這種寫法的好處是,不會覆蓋CMAKE_CXX_FLAGS本來的信息。只是把需要添加的內容添加進去

 

Debug和Release版本:

關鍵在於三個CMake設置:

CMAKE_BUILD_TYPE

CMAKE_CXX_FLAGS_DEBUG

CMAKE_CXX_FLAGS_RELEASE

 

當CMAKE_BUILD_TYPE設置為Debug。 則編譯時採用CMAKE_CXX_FLAGS_DEBUG。

當CMAKE_BUILD_TYPE設置為Release。 則編譯時採用CMAKE_CXX_FLAGS_RELEASE

 

cmake_minimum_required (VERSION 2.6)

project (CMAKE_Test)

add_executable(CMAKE_Test src/banchmark.cpp)

 

#set(CMAKE_BUILD_TYPE Debug)

set(CMAKE_BUILD_TYPE Release)

set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -Wno-unused-but-set-variable")

set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -Wno-unused-but-set-variable")

#多目錄結構的cmake使用

Hello 實際的目錄結構其實並不是所有源碼都存放在src目錄內。

它的目錄結構是:

src: 存放生成庫的源碼。source1.cpp, source2.cpp

test:存放使用庫的測 試程式: main.cpp

include: 存放頭文件: source1.h

resource: 存放第三方庫

build:存放編譯過程的文件

build/lib: 存放生成的libv4l2_utils.so

build/bin:存放main.cpp所產生的測試程式可執行文件。

 

此時,可以採用頂層目錄和每個有源碼的目錄中均創建CMakeLists.txt的方式來處理(和Makefile處理方式類似)

頂層目錄的CMakeLists.txt 內容如下:

CMAKE_MINIMUM_REQUIRED(VERSION 2.6)

PROJECT(Hello)

ADD_SUBDIRECTORIES(src lib)

ADD_SUBDIRECTORIES(test bin)

ADD_SUBDIRECTORIES([source dir] [bin dir] [exclude_from_all])構建添加一個子路徑。source_dir選項指定了CMakeLists.txt源文件和代碼文件的位置。如果source_dir是一個相對路徑,那麼source_dir選項會被解釋為相對於當前的目錄,但是它也可以是一個絕對路徑。binary_dir選項指定了輸出文件的路徑。如果binary_dir是相對路徑,它將會被解釋為相對於當前輸出路徑。

source_dir算相對路徑時,是從CMakeLists.txt算起。

所以src指的是當前 CMakeLists.txt所在路徑下的src. 而bin, lib 指的是當前輸出路徑下的bin,lib. 也就是build/bin build/lib

src CMakeLists.txt :

SET(LIB_SRC_LIST source1.cpp)

SET(CMAKE_BUILD_TYPE Release)

INCLUDE_DIRECTORIES(../include)

ADD_LIBRARY(SOURCE1 SHARED ${LIB_SRC_LIST})

 

test CMakeLists.txt :

SET(EXEC_SRC_LIST main.cpp)

SET(INCLUDE_DIRECTORIES ../include)

SET(LINK_DIR ../../resource)

SET(LINK_DIR "${LINK_DIR} ../../libs/")

SET(CMAKE_BUILD_TYPE Release)

 

INCLUDE_DIRECTORIES(${INCLUDE_DIRECTORIES})

LINK_DIRECTORIES(${LINK_DIR})

ADD_EXECUTABLE(Test_Hello ${EXEC_SRC_LIST})

TARGET_LINK_LIBRARIES(Test_Hello SOURCE1 )

 

#顯示編譯細節

SET(CMAKE_VERBOSE_MAKEFILE ON)

如果不希望改變CMakeLists.txt,可以在創建Makefile時候加入

cmake -DCMAKE_VERBOSE_MAKEFILE=ON

如果連Makefile都不希望修改可以

make VERBOSE=1

 

#相對路徑問題:

set (LIBRARY_DIRECTORIES ../resource)
link_directories(${LIBRARY_DIRECTORIES})

這裡會出警告:

This command specifies the relative path

../resource

可以做如下處理:

set (LIBRARY_DIRECTORIES ../resource)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/${LIBRARY_DIRECTORIES})

#FIND_PACKAGE()功能


可以被用來在系統中自動查找配置構建工程所需的程式庫。在linux和unix類系統下這個命令尤其有用。CMake自帶的模塊文件里有大半是對各種常見開源庫的find_package支持,支持庫的種類非常多.

FIND_PACKAGE(Qt5Widgets)
FIND_PACKAGE( [version] [EXACT] [QUIET] [[REQUIRED|COMPONENTS] [components...]] [NO_POLICY_SCOPE])

查找並載入外來工程的設置。該命令會設置_FOUND變數,用來指示要找的包是否被找到了。如果這個包被找到了,與它相關的信息可以通過包自身記載的變數中得到。REQUIRED選項表示如果報沒有找到的話,cmake的過程會終止,並輸出警告信息

在REQUIRED選項之後,或者如果沒有指定REQUIRED選項但是指定了COMPONENTS選項,在它們的後面可以列出一些與包相關的部件清單(components list)。

FIND_PACKAGE

每一個模塊都會產生如下變數,_FOUND _INCLUDE_DIR _LIBRARY或者_LILBRARIES

如果_FOUND為真,_INCLUDE_DIR加入到INCLUDE_DIRECTORIES中,_LIBRARY加入到TARGET_LINK_LIBRARIES中

就會有相應的變數Qt5Widgets_FOUND,Qt5Widgets_INCLUDE_DIRS等相應的變數生效。

 

PKG_CHECK_MODULES講解 

PKG_CHECK_MODULES(<PREFIX[REQUIRED[QUIET] [NO_CMAKE_PATH[NO_CMAKE_ENVIRONMENT_PATH] <MODULE[<MODULE>]*)

檢測所有給出的modules

PKG_CHECK_MODULES(PC_OPENNI2 libopenni2)

if (NOT PC_OPENNI2_FOUND)

PKG_CHECK_MODULES(PC_OPENNI2 REQUIRED openni2)

endif()

PC_OPENNI2_INCLUDE_DIRS, PC_OPENNI2_LIBRARY_DIRS 等被設置。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前面介紹了視圖的概念和作用,接下來簡單的用實例SQL來展現視圖。 例如:首先,創建表e_information、表e_shareholder: 然後插入表數據等,在此,這簡單的部分我就省略了,直接寫視圖SQL。 創建視圖語句:CREATE VIEW + 視圖名(欄位1,欄位2......) AS S ...
  • 以win7啟動管理器引導作為啟動引導 安裝一個easybcd 然後裡面添加引導選項(添加新條目 >編輯引導菜單(選擇倒計時30秒) >我的電腦--屬性--高級系統設置 啟動和故障恢復 預設操作系統設置為win7即可) 同時也可以用msconfig設置 win+R打開運行 裡面輸入 msconfig ...
  • MongoDB是一個基於分散式文件存儲的資料庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。 MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。他支持的數據結構非常鬆散,是類似json的bson格式,因此可以存儲比較 ...
  • 安裝docker 檢查curl包是否安裝? which curl 如果curl沒有安裝的話,則先更新apt源,並安裝curl,如下: apt-get updateapt-get install curlapt-get updatewget -qO- https://get.docker.com/ | ...
  • 在linux系統下開發C 程式卻會遇到系統不支持conio.h頭文件,無法使用getch()不回顯函數。下麵就演示如何構建函數實現數值輸入不回顯。 運行結果: 說明:Linux下C編程遇到要輸入密碼的問題,可輸入的時候密碼總不能讓人看見吧,本來想用getch()來解決輸入密碼無回顯的問題的,不料Li ...
  • 起始: 待寫…… ...
  • Centos 7 使用firewalld代替了原來的iptables,使用方法如下: >>>關閉防火牆 systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall開機啟動 >> ...
  • 前言 本文主要介紹如何使用Grafana和Prometheus以及node_exporter對Linux伺服器性能進行監控。下麵兩張圖分別是兩台伺服器監控信息: 伺服器A 伺服器B 概述 Prometheus是一個開源的服務監控系統,它通過HTTP協議從遠程的機器收集數據並存儲在本地的時序資料庫上。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...