0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CMake基本指令簡(jiǎn)述

CHANBAEK ? 來(lái)源:編程圈子 ? 作者:編程圈子 ? 2023-03-13 15:41 ? 次閱讀

一、CMake 基本指令

1. ADD_DEFINITIONS

給編譯增加參數(shù)定義,如向 C/C++編譯器添加-D 參數(shù),例:

ADD_DEFINITIONS(-DENABLE_DEBUG -DABC123),多個(gè)參數(shù)使用空格分割。

宏定義 #ifdef ENABLE_DEBUG #endif 會(huì)讓上面指令生效。

2. ADD_DEPENDENCIES

增加 make 里編譯依賴關(guān)系。

ADD_DEPENDENCIES(target-name depend-target1 depend-target2 ...)

兩個(gè)target有依賴關(guān)系時(shí),使用此指令可以自動(dòng)按順序編譯依賴,最后再連接目標(biāo)。

3.ADD_EXECUTABLE

定義可執(zhí)行文件的指令:

ADD_EXECUTABLE(hello main.cpp)

4.ADD_LIBRARY

調(diào)用其它庫(kù),語(yǔ)法:

add_library( [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            source1 [source2 ...])
  • 其中表示鏈接庫(kù)文件的名字,全局唯一;庫(kù)的源文件可指定,也可用target_sources()后續(xù)指定。

  • 庫(kù)的類型: STATIC(靜態(tài)庫(kù))、SHARED(動(dòng)態(tài)庫(kù))、MODULE(模塊庫(kù))之一;如果不設(shè)置,也可以通過全局的 BUILD_SHARED_LIBS 來(lái)指定。

    windows下,如果dll沒有export任何信息,則不能使用SHARED,要標(biāo)識(shí)為MODULE。

添加的庫(kù)會(huì)被輸出到以下幾個(gè)目錄:

  • ARCHIVE_OUTPUT_DIRECTORY
  • LIBRARY_OUTPUT_DIRECTORY
  • RUNTIME_OUTPUT_DIRECTORY
  • 設(shè)置EXCLUDE_FROM_ALL,可使這個(gè)library排除在all之外,即必須明確點(diǎn)擊生成才會(huì)生成。

5. ADD_SUBDIRECTORY

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

這個(gè)指令用于向當(dāng)前工程添加存放源文件的子目錄,并可以指定中間二進(jìn)制和目標(biāo)二進(jìn)制存放的位置。

  • EXCLUDE_FROM_ALL 參數(shù)的含義是將這個(gè)子目錄的所有target排除在all target列表之外,這樣當(dāng)執(zhí)行make時(shí),這個(gè)子目錄的所有target就不會(huì)被編譯。

6. CMAKE_MINIMUM_REQUIRED

CMAKE_MINIMUM_REQUIRED(VERSION versionNumber [FATAL_ERROR])

檢查cmake的版本,要求最低版本為versionNumber。例如 CMAKE_MINIMUM_REQUIRED(VERSION 2.5 FATAL_ERROR) 。

7. INCLUDE_DIRECTORIES

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

指定頭文件的搜索路徑。

例:

include_directories(/usr/local/include)

來(lái)讓庫(kù)文件搜索以/usr/local/include為基礎(chǔ),然后在main函數(shù)前寫上:

#include “opencv/cv.h"

8. LINK_DIRECTORIES

LINK_DIRECTORIES(directory1 directory2 ...)

添加需要鏈接的庫(kù)文件目錄,相當(dāng)于g++命令的-L選項(xiàng)的作用。 該指令有時(shí)候不一定需要,因?yàn)閒ind_package和find_library指令可以得到庫(kù)文件的絕對(duì)路徑。

一般自己寫的動(dòng)態(tài)庫(kù)文件放在自己新建的目錄下時(shí),可以用該指令定位,如:

LINK_DIRECTORIES("/home/my/mylib/bin/mylibs")

9. LINK_LIBRARIES

LINK_LIBRARIES(library1 library2 ...)

添加需要鏈接的庫(kù)文件路徑,注意這里是全路徑,要用在add_executable之前。示例:

LINK_LIBRARIES("/home/my/mylib/bin/mylibs/aaa.so")

10. TARGET_LINK_LIBRARIES

TARGET_LINK_LIBRARIES(target library1

為庫(kù)或二進(jìn)制可執(zhí)行文件添加庫(kù)鏈接,要用在add_executable之后。 上述指令中的target是指通過add_executable()和add_library()指令生成已經(jīng)創(chuàng)建的目標(biāo)文件。示例:

TARGET_LINK_LIBRARIES(myProject hello),連接libhello.so庫(kù)
TARGET_LINK_LIBRARIES(myProject libhello.a)

11. PKG_CHECK_MODULES

pkg_check_modules(

pkg_check_modules 是 CMake 自己的 pkg-config 模塊 的一個(gè)用來(lái)簡(jiǎn)化的封裝:你不用再檢查 CMake 的版本,加載合適的模塊,檢查是否被加載,等等,參數(shù)和傳給 find_package 的一樣:先是待返回變量的前綴,然后是包名(pkg-config 的)。這樣就定義了_INCLUDE_DIRS和其他的這類變量,后續(xù)的用法就與 find_package 一致。

二、 CMake的宏、模塊、函數(shù)

1. 宏 macro定義:

macro( [arg1 [arg2 [arg3 ...]]])
...
endmacro([name])

2. function定義:

function( [arg1 [arg2 [arg3 ...]]])
...
endfunction([name])

函數(shù)和宏都有默認(rèn)內(nèi)部變量可以使用:

變量 說(shuō)明
ARGV# ARGV0為第一個(gè)參數(shù),ARGV1為第二個(gè)參數(shù),依次類推
ARGV 定義宏(函數(shù))時(shí)參數(shù)為2個(gè),實(shí)際傳了4個(gè),則ARGV代表實(shí)際傳入的兩個(gè)
ARGN 定義宏(函數(shù))時(shí)參數(shù)為2個(gè),實(shí)際傳了4個(gè),則ARGN代表剩下的兩個(gè)
ARGC 實(shí)際傳入的參數(shù)的個(gè)數(shù)

調(diào)用示例:

# 定義函數(shù)
Function(myfunction ag1 ag2)
message(STATUS "function ag is " ${ag1})
message(STATUS "function ag is " ${ag2})
endfunction(myfunction)


# 定義宏
macro(mymacro ag1 ag2)
message(STATUS "macro ag is " ${ag1})
message(STATUS "macro ag is " ${ag2})
endmacro(mymacro)

# 調(diào)用函數(shù)
myfunction(1 2 3)
message(STATUS "\\n")

# 調(diào)用宏
mymacro(1 2 3)

要注意的是 宏的ARGN、ARGV等內(nèi)部變量不能直接在if、foreach(…IN LISTS…)等邏輯語(yǔ)句中使用。

二、模塊

1. 模塊說(shuō)明

CMakeLists.txt和**.cmake結(jié)尾的文件可以用來(lái)作為CMake的模塊文件,用來(lái)封裝一些函數(shù)功能,再使用include(**.cmake)方式引用。

cmake系統(tǒng)本身內(nèi)置了一些預(yù)定義的模塊,如FindCURL模塊。

預(yù)定義模塊可以通過FIND_PACKAGE指令來(lái)引用。

2. 模塊定義示例

根目錄的主Cmake文件定義

# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)

# 項(xiàng)目工程名
project (example)
message(STATUS "root This is BINARY dir " ${PROJECT_BINARY_DIR})
message(STATUS "root This is SOURCE dir " ${PROJECT_SOURCE_DIR})

# 添加子目錄
ADD_SUBDIRECTORY(subDirectory)

子模塊定義

創(chuàng)建

subDirectory/CMakeLists.txt,內(nèi)容如下:

# 打印信息
message(STATUS "src This is BINARY dir " ${PROJECT_BINARY_DIR})
message(STATUS "src This is SOURCE dir " ${PROJECT_SOURCE_DIR})

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

# CMAKE_SOURCE_DIR 是cmake內(nèi)置變量,工程根目錄的CMakeLists.txt文件路徑
SET(ROOT_DIR ${CMAKE_SOURCE_DIR})

# 構(gòu)建可執(zhí)行程序
ADD_EXECUTABLE(example main.cpp)

# 查找指定的庫(kù),CURL是
FIND_PACKAGE(CURL)
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • WINDOWS
    +關(guān)注

    關(guān)注

    3

    文章

    3510

    瀏覽量

    88239
  • 指令
    +關(guān)注

    關(guān)注

    1

    文章

    604

    瀏覽量

    35594
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2090

    瀏覽量

    73420
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1608

    瀏覽量

    48986
  • CMake
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    1255
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    cmake是什么?cmake的特性和編譯原理(cmake原理和cmake編譯過程)

    CMake是一個(gè)開源、跨平臺(tái)的工具系列,是用來(lái)構(gòu)建、測(cè)試和打包軟件。
    的頭像 發(fā)表于 07-18 10:53 ?4152次閱讀
    <b class='flag-5'>cmake</b>是什么?<b class='flag-5'>cmake</b>的特性和編譯原理(<b class='flag-5'>cmake</b>原理和<b class='flag-5'>cmake</b>編譯過程)

    Windows下編譯工具CMake的安裝和最簡(jiǎn)使用

    MCU的開發(fā)環(huán)境一般在Windows操作系統(tǒng)上,簡(jiǎn)單的工程一般直接編寫Makefile文件后使用make工具構(gòu)建程序,復(fù)雜的工程一般借助CMake來(lái)生成Makefile文件后使用make工程構(gòu)建程序
    的頭像 發(fā)表于 11-14 10:18 ?6847次閱讀
    Windows下編譯工具<b class='flag-5'>CMake</b>的安裝和最簡(jiǎn)使用

    14. 在 CMake 中自定義宏___CMake 保姆級(jí)教程【C_C++】

    CMake
    jf_97106930
    發(fā)布于 :2023年05月19日 12:49:38

    交叉平臺(tái)開源編譯系統(tǒng)_cmake入門

    交叉平臺(tái)開源編譯系統(tǒng)_cmake入門
    發(fā)表于 01-22 13:59 ?9次下載

    Cmake學(xué)習(xí)的總結(jié)(二)

    大家好,上次給大家分享了第一篇 cmake 文章:cmake學(xué)習(xí)總結(jié)(一),今天繼續(xù)給大家分享cmake。那么廢話就不多說(shuō),開始內(nèi)容分享。
    的頭像 發(fā)表于 12-24 17:54 ?599次閱讀

    cmake管理配置ROOT項(xiàng)目的方法

    ROOT作為使用C++開發(fā)的工具庫(kù),自然少不了cmake這個(gè)項(xiàng)目組織工具。本文簡(jiǎn)單介紹下cmake管理配置ROOT項(xiàng)目的方法,先上總圖 ? ? ? 本項(xiàng)目有一個(gè)頭文件,兩個(gè)源文件以及一個(gè)cmake
    的頭像 發(fā)表于 01-18 17:45 ?4482次閱讀
    <b class='flag-5'>cmake</b>管理配置ROOT項(xiàng)目的方法

    如何使用CMake工具套件構(gòu)建CUDA應(yīng)用程序

    我希望這篇文章向您展示了 CMake 如何自然地支持構(gòu)建 CUDA 應(yīng)用程序。如果您是 CMake 的現(xiàn)有用戶,請(qǐng)?jiān)囉?CMake 3 . 9 并利用改進(jìn)的 CUDA 支持。如果您不是 CMa
    的頭像 發(fā)表于 04-01 17:42 ?4364次閱讀
    如何使用<b class='flag-5'>CMake</b>工具套件構(gòu)建CUDA應(yīng)用程序

    RT-Thread V4.1.0新特性CMake介紹與構(gòu)建CMake工程

    ? ? CMake 支持 在 RT-Thread 4.1.0 正式發(fā)布版中,添加了對(duì) CMake 的支持。開發(fā)者可以使用 SCons 工具來(lái)生成 CMakeLists.txt 文件。 為何要支持
    的頭像 發(fā)表于 05-24 19:20 ?2900次閱讀

    RT-Thread 4.1.0的CMake構(gòu)建教程

    CMake 支持 在 RT-Thread 4.1.0 正式發(fā)布版中,添加了對(duì) CMake 的支持。開發(fā)者可以使用 SCons 工具來(lái)生成 CMakeLists.txt 文件。 為何要支持 CMake
    的頭像 發(fā)表于 05-25 11:06 ?3245次閱讀

    CMake用法詳解

    CMake用法詳解
    發(fā)表于 10-25 16:28 ?2次下載

    CMake的實(shí)戰(zhàn)教程-1

    CMake 是一個(gè)跨平臺(tái)的構(gòu)建系統(tǒng)生成工具。它使用平臺(tái)無(wú)關(guān)的 CMake 清單文件CMakeLists.txt,指定工程的構(gòu)建過程;源碼樹的每個(gè)路徑下都有這個(gè)文件。CMake 產(chǎn)生一個(gè)適用于具體平臺(tái)的構(gòu)建系統(tǒng),用戶使用這個(gè)系統(tǒng)構(gòu)
    的頭像 發(fā)表于 02-14 10:42 ?673次閱讀
    <b class='flag-5'>CMake</b>的實(shí)戰(zhàn)教程-1

    cmake常用命令解析使用

    cmake構(gòu)建工程需要知道的基礎(chǔ)命令。
    發(fā)表于 09-18 17:53 ?0次下載

    在Linux下如何使用CMake編譯程序

    CMake是開源、跨平臺(tái)的構(gòu)建工具,可以讓我們通過編寫簡(jiǎn)單的配置文件去生成本地的Makefile,這個(gè)配置文件是獨(dú)立于運(yùn)行平臺(tái)和編譯器的,這樣就不用親自去編寫Makefile了,而且配置文件可以直接
    的頭像 發(fā)表于 11-08 16:15 ?5692次閱讀
    在Linux下如何使用<b class='flag-5'>CMake</b>編譯程序

    CMake構(gòu)建后的項(xiàng)目結(jié)構(gòu)解析

    一、 CMake構(gòu)建后的項(xiàng)目結(jié)構(gòu)解析(Analysis of the Project Structure After CMake Build) 1.1 CMake構(gòu)建后的目錄結(jié)構(gòu)(Directory
    的頭像 發(fā)表于 11-10 10:27 ?1727次閱讀
    <b class='flag-5'>CMake</b>構(gòu)建后的項(xiàng)目結(jié)構(gòu)解析

    請(qǐng)問一下CMake和Make之間的區(qū)別有哪些?

    CMake和Make是構(gòu)建軟件,其工作涉及將源代碼轉(zhuǎn)換為可執(zhí)行程序。CMake和Make是旨在實(shí)現(xiàn)構(gòu)建過程自動(dòng)化的工具,幫助開發(fā)者節(jié)省時(shí)間和精力。
    的頭像 發(fā)表于 02-27 11:44 ?1629次閱讀