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

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

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

什么是cmake

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

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

入門實踐

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

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

項目只有一個源文件,結(jié)構(gòu)如下,我們一般會新建一個目錄存儲cmake運行的產(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)
# 項目信息
project (Demo1)
# 指定生成目標(biāo)
add_executable(Demo main.cc)

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

同一個目錄,多個源文件

如果我們將Demo1中main.cc的power函數(shù)抽取出來放到MathFunctions.cc中,項目結(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)
# 項目信息
project (Demo2)
# 查找目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 指定生成目標(biāo)
add_executable(Demo ${DIR_SRCS})

多個目錄多個源文件

現(xiàn)在我們將MathFounction.h和MathFounction.cpp移動到math目錄下,項目結(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)
# 項目信息
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)指明本項目包含一個子目錄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)鏈接庫

自定義編譯選項

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

cmake_minimum_required (VERSION 2.8)
# 項目信息
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生成,通過這樣的機制可以通過預(yù)定義一些參數(shù)和變量來控制代碼的生成,config.h.in內(nèi)容如下:

#cmakedefine USE_MYMATH

其中的option命令添加了一個USE_MYMATH選項,并且默認值為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語言合并排序及實例代碼

    C語言合并排序及實例代碼

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

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

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

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

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

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

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

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

    這篇文章主要介紹了C++中用new創(chuàng)建二維數(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)境的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C語言改造通訊錄操作詳解

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

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

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

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

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

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

最新評論

青铜峡市| 贵州省| 特克斯县| 武隆县| 廉江市| 九龙城区| 甘泉县| 宁海县| 章丘市| 冷水江市| 玛曲县| 丹棱县| 平利县| 库伦旗| 徐汇区| 黄浦区| 宁都县| 宁陵县| 青阳县| 黔江区| 乌什县| 白水县| 黄陵县| 剑川县| 册亨县| 宜宾市| 洱源县| 襄樊市| 伊金霍洛旗| 南投县| 永善县| 襄樊市| 枣强县| 湘乡市| 天全县| 关岭| 梁平县| 喀喇沁旗| 瓮安县| 宁都县| 绥宁县|