最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從零學(xué)習(xí)cmake構(gòu)建系統(tǒng)

 更新時間:2023年02月07日 11:30:08   作者:月下西樓  
這篇文章主要為大家介紹了從零學(xué)習(xí)cmake構(gòu)建系統(tǒng)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是cmake

根據(jù)其官網(wǎng)的定義,cmake是一個開源跨平臺的,用于構(gòu)建、測試和打包軟件的一個套件工具。與cmake相關(guān)的幾個概念需要明晰,如GCC,make和makefile。

  • GCC:GCC是GNU Compiler Collection(就是GNU編譯器套件),也可以簡單認(rèn)為是編譯器,它可以編譯很多種編程語言(括C、C++、Objective-C、Fortran、Java等等)
  • make:make工具可以看成是一個智能的批處理工具,它本身并沒有編譯和鏈接的功能,而是用類似于批處理的方式通過調(diào)用makefile文件中用戶指定的命令來進(jìn)行編譯和鏈接的。
  • makefile,makefile就是GCC命令的集合,make工具就根據(jù)makefile中的命令進(jìn)行編譯和鏈接的
  • cmake,當(dāng)項(xiàng)目非常大時,手寫makefile會非常煩碎,而且不同平臺makefile也會不同,所以cmake就是可以根據(jù)CMakeLists.txt自動生成makefile。

入門實(shí)踐

我們已經(jīng)對于cmake有了一個總體上的認(rèn)識,接下來就通過官方提供的幾個例子介紹下如何使用cmake。

構(gòu)建單個源文件

項(xiàng)目只有一個源文件,結(jié)構(gòu)如下,我們一般會新建一個目錄存儲cmake運(yùn)行的產(chǎn)物,這里我新建了一個build目錄。

├── CMakeLists.txt
├── build
└── main.cc

main.cc的內(nèi)容如下

#include <stdio.h>
#include <stdlib.h>
/**
 * power - Calculate the power of number.
 * @param base: Base value.
 * @param exponent: Exponent value.
 *
 * @return base raised to the power exponent.
 */
double power(double base, int exponent)
{
    int result = base;
    int i;
    if (exponent == 0) {
        return 1;
    }
    for(i = 1; i < exponent; ++i){
        result = result * base;
    }
    return result;
}
int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
    double result = power(base, exponent);
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

CMakeLists.txt的內(nèi)容如下:

# Cmake的最低版本號的要求
cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (Demo1)
# 指定生成目標(biāo)
add_executable(Demo main.cc)

在build目錄下執(zhí)行cmake .. 然后執(zhí)行make命令就可以得到Demo1的可執(zhí)行文件。

同一個目錄,多個源文件

如果我們將Demo1中main.cc的power函數(shù)抽取出來放到MathFunctions.cc中,項(xiàng)目結(jié)構(gòu)如下:

├── CMakeLists.txt
├── MathFunctions.cc
├── MathFunctions.h
├── build
└── main.cc

那么該如何編譯呢,我們可以通過在add_executable命令中增加將MathFunctions.cc,效果如下add_executable(Demo main.cc MathFunctions.cc),但是如果有很多文件的情況下,一個文件一個文件的添加很麻煩,cmake提供了aux_source_directory命令,該命令會查找指定目錄下所有的源文件,然后將結(jié)果存到指定的變量名。CMakeLists.txt文件內(nèi)容如下

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (Demo2)
# 查找目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 指定生成目標(biāo)
add_executable(Demo ${DIR_SRCS})

多個目錄多個源文件

現(xiàn)在我們將MathFounction.h和MathFounction.cpp移動到math目錄下,項(xiàng)目結(jié)構(gòu)如下:

├── CMakeLists.txt
├── build
├── main.cc
└── math
    ├── CMakeLists.txt
    ├── MathFunctions.cc
    └── MathFunctions.h

面對這種情況我們需要在Demo3目錄下和math目錄下各自編寫一個CmakeLists.txt文件,我們可以將math目錄里面的文件編譯成靜態(tài)庫再由main函數(shù)調(diào)用。 Demo3目錄下的CMakeLists.txt內(nèi)容如下

# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (Demo3)
# 查找目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 添加 math 子目錄
add_subdirectory(math)
# 指定生成目標(biāo)
add_executable(Demo ${DIR_SRCS})
# 添加鏈接庫
target_link_libraries(Demo MathFunctions)

add_subdictory(math)指明本項(xiàng)目包含一個子目錄math,這樣,math目錄下的CMakeLists.txt文件和源代碼也會被使用,最后一行target_link_libraries指明可執(zhí)行文件需要鏈接一個名為MathFunctions的鏈接庫。math目錄下CMakeLists.txt內(nèi)容如下

# 查找當(dāng)前目錄下的所有源文件
# 并將名稱保存到 DIR_LIB_SRCS 變量
aux_source_directory(. DIR_LIB_SRCS)
# 指定生成 MathFunctions 鏈接庫
add_library (MathFunctions ${DIR_LIB_SRCS})

該文件中使用命令add_library將src目錄中源文件編譯為靜態(tài)鏈接庫

自定義編譯選項(xiàng)

CMake允許為項(xiàng)目增加編譯選項(xiàng),從而可以根據(jù)用戶的環(huán)境和要求選擇最合適的編譯方案,例如可以將MathFunctions庫設(shè)置為一個可選的庫,如果該選項(xiàng)為ON,則使用該庫定義的函數(shù)來進(jìn)行運(yùn)算,否則就調(diào)用標(biāo)準(zhǔn)庫的數(shù)學(xué)函數(shù)庫。 為了實(shí)現(xiàn)這樣的目的我們需要在頂層的CMakeLists.txt中添加該選項(xiàng),其內(nèi)容如下

cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (Demo4)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 是否使用自己的 MathFunctions 庫
option (USE_MYMATH
	   "Use provided math implementation" ON)
# 加入一個配置頭文件,用于處理 CMake 對源碼的設(shè)置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )
# 是否加入 MathFunctions 庫
if (USE_MYMATH)
  include_directories ("${PROJECT_SOURCE_DIR}/math")
  add_subdirectory (math)
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
# 查找當(dāng)前目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 指定生成目標(biāo)
add_executable (Demo ${DIR_SRCS})
target_link_libraries (Demo  ${EXTRA_LIBS})

其中configure_file命令用于加入一個配置文件config.h,這個文件由CMake從config.h.in生成,通過這樣的機(jī)制可以通過預(yù)定義一些參數(shù)和變量來控制代碼的生成,config.h.in內(nèi)容如下:

#cmakedefine USE_MYMATH

其中的option命令添加了一個USE_MYMATH選項(xiàng),并且默認(rèn)值為ON。之后根據(jù)USE_MYMATH變量的值決定是否使用我門自己編寫的MathFounctions庫

然后需要更改main.cc文件讓其根據(jù)USE_MYMATH的值確定是否調(diào)用標(biāo)準(zhǔn)庫,內(nèi)容如下:

#include <stdio.h>
#include <stdlib.h>
#include <config.h>
#ifdef USE_MYMATH
  #include <MathFunctions.h>
#else
  #include <math.h>
#endif
int main(int argc, char *argv[])
{
    if (argc < 3){
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }
    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);
#ifdef USE_MYMATH
    printf("Now we use our own Math library. \n");
    double result = power(base, exponent);
#else
    printf("Now we use the standard library. \n");
    double result = pow(base, exponent);
#endif
    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

值得注意的是這里引入了一個config.h,這個文件預(yù)定義了 USE_MYMATH 的值。但我們并不直接編寫這個文件,而是由CMake根據(jù)config.h.in自動生成。

最后

這篇文章主要介紹了cmake的簡單使用,更多關(guān)于cmake構(gòu)建系統(tǒng)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言合并排序及實(shí)例代碼

    C語言合并排序及實(shí)例代碼

    本篇文章主要介紹C語言合并排序算法,這里對合并排序通過實(shí)例代碼進(jìn)行了詳細(xì)講解,希望能幫助到大家學(xué)習(xí)
    2016-07-07
  • C語言文件操作詳情(一)

    C語言文件操作詳情(一)

    這篇文章主要介紹了C語言文件操作詳情,主要討論的是數(shù)據(jù)文件,通過處理的磁盤上的文件展開主題內(nèi)容介紹,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-04-04
  • C語言實(shí)現(xiàn)車輛信息管理系統(tǒng)

    C語言實(shí)現(xiàn)車輛信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)車輛信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言實(shí)現(xiàn)ATM自動取款機(jī)系統(tǒng)的示例代碼

    C語言實(shí)現(xiàn)ATM自動取款機(jī)系統(tǒng)的示例代碼

    ATM自動取款機(jī)系統(tǒng)是銀行業(yè)務(wù)流程中十分重要且必備的環(huán)節(jié)之一,在銀行業(yè)務(wù)流程中起著承上啟下的作用。本文將用C語言實(shí)現(xiàn)一個簡單的ATM自動取款機(jī)系統(tǒng),需要的可以參考一下
    2022-08-08
  • C++中用new創(chuàng)建二維數(shù)組和指針數(shù)組實(shí)例代碼

    C++中用new創(chuàng)建二維數(shù)組和指針數(shù)組實(shí)例代碼

    這篇文章主要介紹了C++中用new創(chuàng)建二維數(shù)組和指針數(shù)組實(shí)例代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下
    2017-03-03
  • 詳解C++ 中的三種繼承方式

    詳解C++ 中的三種繼承方式

    這篇文章主要介紹了詳解C++ 中的三種繼承方式,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-03-03
  • 在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟

    在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟

    這篇文章主要介紹了在Ubuntu中安裝VSCode并配置C/C++開發(fā)環(huán)境的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C語言改造通訊錄操作詳解

    C語言改造通訊錄操作詳解

    這篇文章主要介紹了C語言文件操作改造通訊錄方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • C++實(shí)現(xiàn)簡單的希爾排序Shell Sort實(shí)例

    C++實(shí)現(xiàn)簡單的希爾排序Shell Sort實(shí)例

    這篇文章主要介紹了C++實(shí)現(xiàn)簡單的希爾排序Shell Sort實(shí)例,對于正在學(xué)習(xí)算法的朋友很有借鑒價值,需要的朋友可以參考下
    2014-07-07
  • 利用C語言玩轉(zhuǎn)魔方陣實(shí)例教程

    利用C語言玩轉(zhuǎn)魔方陣實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于利用C語言玩轉(zhuǎn)魔方陣的相關(guān)資料,文中詳細(xì)介紹了關(guān)于奇數(shù)魔方陣和4N 魔方陣的實(shí)現(xiàn)方法,通過示例代碼讓大家更好的參考學(xué)習(xí),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11

最新評論

老河口市| 太原市| 抚州市| 彝良县| 丰顺县| 巫山县| 左权县| 南岸区| 平和县| 佛学| 沙雅县| 杭州市| 鄂尔多斯市| 镇康县| 施甸县| 忻州市| 河曲县| 济南市| 武定县| 塘沽区| 兴和县| 抚宁县| 祁连县| 仙桃市| 阿合奇县| 临猗县| 余姚市| 读书| 江永县| 大渡口区| 仪征市| 苏州市| 德钦县| 东山县| 瓦房店市| 将乐县| 望奎县| 叙永县| 河曲县| 共和县| 泰来县|