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

超詳細(xì)的cmake入門教程

 更新時(shí)間:2020年02月14日 22:11:24   投稿:mdxy-dxy  
這篇文章主要介紹了超詳細(xì)的cmake入門教程,需要的朋友可以參考下

什么是cmake

你或許聽過(guò)好幾種 Make 工具,例如 GNU Make ,QT 的 qmake ,微軟的 MSnmake,BSD Make(pmake),Makepp,等等。這些 Make 工具遵循著不同的規(guī)范和標(biāo)準(zhǔn),所執(zhí)行的 Makefile 格式也千差萬(wàn)別。這樣就帶來(lái)了一個(gè)嚴(yán)峻的問(wèn)題:如果軟件想跨平臺(tái),必須要保證能夠在不同平臺(tái)編譯。而如果使用上面的 Make 工具,就得為每一種標(biāo)準(zhǔn)寫一次 Makefile ,這將是一件讓人抓狂的工作。
CMake CMake附圖 1 CMake就是針對(duì)上面問(wèn)題所設(shè)計(jì)的工具:它首先允許開發(fā)者編寫一種平臺(tái)無(wú)關(guān)的 CMakeList.txt 文件來(lái)定制整個(gè)編譯流程,然后再根據(jù)目標(biāo)用戶的平臺(tái)進(jìn)一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。從而做到“Write once, run everywhere”。顯然,CMake 是一個(gè)比上述幾種 make 更高級(jí)的編譯配置工具。一些使用 CMake 作為項(xiàng)目架構(gòu)系統(tǒng)的知名開源項(xiàng)目有 VTK、ITK、KDE、OpenCV、OSG 等。

在 linux 平臺(tái)下使用 CMake 生成 Makefile 并編譯的流程如下:

  1. 編寫 CMake 配置文件 CMakeLists.txt 。
  2. 執(zhí)行命令 cmake PATH 或者 ccmake PATH 生成 Makefile。其中, PATH 是 CMakeLists.txt 所在的目錄。(ccmake 和 cmake 的區(qū)別在于前者提供了一個(gè)交互式的界面)
  3. 使用 make 命令進(jìn)行編譯。

入門案例:?jiǎn)蝹€(gè)源文件

本節(jié)對(duì)應(yīng)的源代碼所在目錄:Demo1。
對(duì)于簡(jiǎn)單的項(xiàng)目,只需要寫幾行代碼就可以了。例如,假設(shè)現(xiàn)在我們的項(xiàng)目中只有一個(gè)源文件 main.cc ,該程序的用途是計(jì)算一個(gè)數(shù)的指數(shù)冪。

#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

首先編寫 CMakeLists.txt 文件,并保存在與 main.cc 源文件同個(gè)目錄下:

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

CMakeLists.txt 的語(yǔ)法比較簡(jiǎn)單,由命令、注釋和空格組成,其中命令是不區(qū)分大小寫的。符號(hào) # 后面的內(nèi)容被認(rèn)為是注釋。命令由命令名稱、小括號(hào)和參數(shù)組成,參數(shù)之間使用空格進(jìn)行間隔。

對(duì)于上面的 CMakeLists.txt 文件,依次出現(xiàn)了幾個(gè)命令:

  1. cmake_minimum_required:指定運(yùn)行此配置文件所需的 CMake 的最低版本;
  2. project:參數(shù)值是 Demo1,該命令表示項(xiàng)目的名稱是 Demo1 。
  3. add_executable: 將名為 main.cc 的源文件編譯成一個(gè)名稱為 Demo 的可執(zhí)行文件。

編譯項(xiàng)目

之后,在當(dāng)前目錄執(zhí)行 cmake . ,得到 Makefile 后再使用 make 命令編譯得到 Demo1 可執(zhí)行文件。

[ehome@xman Demo1]$ cmake .
-- The C compiler identification is GNU 4.8.2
-- The CXX compiler identification is GNU 4.8.2
-- Check for working C compiler: /usr/sbin/cc
-- Check for working C compiler: /usr/sbin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/sbin/c++
-- Check for working CXX compiler: /usr/sbin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ehome/Documents/programming/C/power/Demo1
[ehome@xman Demo1]$ make
Scanning dependencies of target Demo
[100%] Building C object CMakeFiles/Demo.dir/main.cc.o
Linking C executable Demo
[100%] Built target Demo
[ehome@xman Demo1]$ ./Demo 5 4
5 ^ 4 is 625
[ehome@xman Demo1]$ ./Demo 7 3
7 ^ 3 is 343
[ehome@xman Demo1]$ ./Demo 2 10
2 ^ 10 is 1024

多個(gè)源文件

同一目錄,多個(gè)源文件

本小節(jié)對(duì)應(yīng)的源代碼所在目錄:Demo2。
上面的例子只有單個(gè)源文件?,F(xiàn)在假如把 power 函數(shù)單獨(dú)寫進(jìn)一個(gè)名為MathFunctions.c 的源文件里,使得這個(gè)工程變成如下的形式:

./Demo2
    |
    +--- main.cc
    |
    +--- MathFunctions.cc
    |
    +--- MathFunctions.h

這個(gè)時(shí)候,CMakeLists.txt 可以改成如下的形式:

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

唯一的改動(dòng)只是在 add_executable 命令中增加了一個(gè) MathFunctions.cc 源文件。這樣寫當(dāng)然沒什么問(wèn)題,但是如果源文件很多,把所有源文件的名字都加進(jìn)去將是一件煩人的工作。更省事的方法是使用 aux_source_directory 命令,該命令會(huì)查找指定目錄下的所有源文件,然后將結(jié)果存進(jìn)指定變量名。其語(yǔ)法如下:

aux_source_directory(<dir> <variable>)

因此,可以修改 CMakeLists.txt 如下:

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

這樣,CMake 會(huì)將當(dāng)前目錄所有源文件的文件名賦值給變量 DIR_SRCS ,再指示變量 DIR_SRCS 中的源文件需要編譯成一個(gè)名稱為 Demo 的可執(zhí)行文件。

多個(gè)目錄,多個(gè)源文件

本小節(jié)對(duì)應(yīng)的源代碼所在目錄:Demo3。
現(xiàn)在進(jìn)一步將 MathFunctions.h 和 MathFunctions.cc 文件移動(dòng)到 math 目錄下。

./Demo3
    |
    +--- main.cc
    |
    +--- math/
          |
          +--- MathFunctions.cc
          |
          +--- MathFunctions.h

對(duì)于這種情況,需要分別在項(xiàng)目根目錄 Demo3 和 math 目錄里各編寫一個(gè) CMakeLists.txt 文件。為了方便,我們可以先將 math 目錄里的文件編譯成靜態(tài)庫(kù)再由 main 函數(shù)調(diào)用。

根目錄中的 CMakeLists.txt :

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

該文件添加了下面的內(nèi)容: 第3行,使用命令 add_subdirectory 指明本項(xiàng)目包含一個(gè)子目錄 math,這樣 math 目錄下的 CMakeLists.txt 文件和源代碼也會(huì)被處理 。第6行,使用命令 target_link_libraries 指明可執(zhí)行文件 main 需要連接一個(gè)名為 MathFunctions 的鏈接庫(kù) 。

子目錄中的 CMakeLists.txt:

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

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

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

本節(jié)對(duì)應(yīng)的源代碼所在目錄:Demo4。
CMake 允許為項(xiàng)目增加編譯選項(xiàng),從而可以根據(jù)用戶的環(huán)境和需求選擇最合適的編譯方案。

例如,可以將 MathFunctions 庫(kù)設(shè)為一個(gè)可選的庫(kù),如果該選項(xiàng)為 ON ,就使用該庫(kù)定義的數(shù)學(xué)函數(shù)來(lái)進(jìn)行運(yùn)算。否則就調(diào)用標(biāo)準(zhǔn)庫(kù)中的數(shù)學(xué)函數(shù)庫(kù)。
修改 CMakeLists 文件

我們要做的第一步是在頂層的 CMakeLists.txt 文件中添加該選項(xiàng): 

# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (Demo4)
# 加入一個(gè)配置頭文件,用于處理 CMake 對(duì)源碼的設(shè)置
configure_file (
"${PROJECT_SOURCE_DIR}/config.h.in"
"${PROJECT_BINARY_DIR}/config.h"
)
# 是否使用自己的 MathFunctions 庫(kù)
option (USE_MYMATH
"Use provided math implementation" ON)
# 是否加入 MathFunctions 庫(kù)
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})

其中:

第7行的 configure_file 命令用于加入一個(gè)配置頭文件 config.h ,這個(gè)文件由 CMake 從 config.h.in 生成,通過(guò)這樣的機(jī)制,將可以通過(guò)預(yù)定義一些參數(shù)和變量來(lái)控制代碼的生成。
第13行的 option 命令添加了一個(gè) USE_MYMATH 選項(xiàng),并且默認(rèn)值為 ON 。
第17行根據(jù) USE_MYMATH 變量的值來(lái)決定是否使用我們自己編寫的 MathFunctions 庫(kù)。

修改 main.cc 文件

之后修改 main.cc 文件,讓其根據(jù) USE_MYMATH 的預(yù)定義值來(lái)決定是否調(diào)用標(biāo)準(zhǔn)庫(kù)還是 MathFunctions 庫(kù):

#include 
#include 
#include "config.h"
#ifdef USE_MYMATH
 #include "math/MathFunctions.h"
#else
 #include 
#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.in 文件

上面的程序值得注意的是第2行,這里引用了一個(gè) config.h 文件,這個(gè)文件預(yù)定義了 USE_MYMATH 的值。但我們并不直接編寫這個(gè)文件,為了方便從 CMakeLists.txt 中導(dǎo)入配置,我們編寫一個(gè) config.h.in 文件,內(nèi)容如下:

#cmakedefine USE_MYMATH

這樣 CMake 會(huì)自動(dòng)根據(jù) CMakeLists 配置文件中的設(shè)置自動(dòng)生成 config.h 文件。
編譯項(xiàng)目
現(xiàn)在編譯一下這個(gè)項(xiàng)目,為了便于交互式的選擇該變量的值,可以使用 ccmake 命令(也可以使用 cmake -i 命令,該命令會(huì)提供一個(gè)會(huì)話式的交互式配置界面。 )

從中可以找到剛剛定義的 USE_MYMATH 選項(xiàng),按鍵盤的方向鍵可以在不同的選項(xiàng)窗口間跳轉(zhuǎn),按下 enter 鍵可以修改該選項(xiàng)。修改完成后可以按下 c 選項(xiàng)完成配置,之后再按 g 鍵確認(rèn)生成 Makefile 。ccmake 的其他操作可以參考窗口下方給出的指令提示。

我們可以試試分別將 USE_MYMATH 設(shè)為 ON 和 OFF 得到的結(jié)果:

USE_MYMATH 為 ON

運(yùn)行結(jié)果:

[ehome@xman Demo4]$ ./Demo
Now we use our own MathFunctions library.
7 ^ 3 = 343.000000
10 ^ 5 = 100000.000000
2 ^ 10 = 1024.000000

此時(shí) config.h 的內(nèi)容為:

#define USE_MYMATH

USE_MYMATH 為 OFF

運(yùn)行結(jié)果:

[ehome@xman Demo4]$ ./Demo
Now we use the standard library.
7 ^ 3 = 343.000000
10 ^ 5 = 100000.000000
2 ^ 10 = 1024.000000

此時(shí) config.h 的內(nèi)容為:

/* #undef USE_MYMATH */

 下面是其他網(wǎng)友的補(bǔ)充

使用cmake編譯,組織C++項(xiàng)目

前言
這篇博客是我對(duì)cmake用法的一些經(jīng)驗(yàn)總結(jié), 還很淺顯, 如果有錯(cuò)誤或者更好的方案, 歡迎指正~

使用方法統(tǒng)一為在build目錄中執(zhí)行:

$: cmake ..
$: make

我覺得養(yǎng)成外部編譯是一個(gè)好習(xí)慣

例一

目錄結(jié)構(gòu)為:

lzj@lzj:~/C-Plus-Plus/makefile_cmake/cmake_1$ tree
.
├── build
├── CMakeLists.txt
└── src
    ├── hello
    │   ├── hello.cc
    │   └── hello.h
    ├── main.cpp
    └── world
        ├── world.cc
        └── world.h

src 目錄中不同屬性類維護(hù)在不同目錄中

main.cpp中使用hello.h和world.h

CMakeLists.txt為 :

cmake_minimum_required (VERSION 3.0)
project (test_1)

aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src/hello SOURCE_HELLO)
aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src/world SOURCE_WORLD)

add_definitions("-g -Wall -std=c++11")

add_executable(main
               ${CMAKE_CURRENT_LIST_DIR}/src/main.cpp
               ${SOURCE_HELLO}
               ${SOURCE_WORLD})

例二

目錄結(jié)構(gòu)為:

lzj@lzj:~/C-Plus-Plus/makefile_cmake/cmake_2$ tree
.
├── build
├── CMakeLists.txt
├── include
│   └── person.h
└── src
    ├── main.cpp
    └── person.cc

include目錄下統(tǒng)一包含頭文件和宏定義之類, 源文件放在 src 目錄下維護(hù)

person 類是一個(gè)簡(jiǎn)單的空類, 擁有一個(gè)私有成員變量val, 一個(gè)公有成員函數(shù)來(lái)打印該變量, 在main.cpp中調(diào)用

CMakeLists.txt為 :

cmake_minimum_required(VERSION 3.0)
project(test_2)

include_directories(${PROJECT_SOURCE_DIR}/include)

add_definitions("-g -Wall -std=c++11")

add_executable(main
               ${PROJECT_SOURCE_DIR}/src/main.cpp #這個(gè)路徑看這個(gè)main.cpp位于哪里了              
               ${PROJECT_SOURCE_DIR}/src/person.cc)

例三

目錄結(jié)構(gòu)為:

lzj@lzj:~/C-Plus-Plus/makefile_cmake/cmake_3$ tree
.
├── build
├── CMakeLists.txt
├── main.cpp
└── src
    ├── CMakeLists.txt
    ├── hello.cc
    ├── hello.h
    ├── world.cc
    └── world.h

將編寫的代碼編譯為庫(kù), 在main.cpp中使用, 編譯main.cpp時(shí)鏈接該庫(kù)

頂層目錄中CMakeLists.txt為:

cmake_minimum_required (VERSION 3.0)
project (test_3)

add_subdirectory(src)

add_definitions("-g -Wall -std=c++11")

add_executable(main main.cpp)
target_link_libraries(main TEST3) #自己的庫(kù)名為TEST3

子目錄 src 中的CMakeLists.txt為:

aux_source_directory(. DIR_LIB_SRCS)

add_library (TEST3 ${DIR_LIB_SRCS})

當(dāng)然如果src目錄下為多文件時(shí), 每個(gè)目錄下都要添加該語(yǔ)句的CMakeLists.txt

源代碼

 這篇文章就介紹到這了,希望大家以后多多支持腳本之家。

相關(guān)文章

  • c語(yǔ)言double類型默認(rèn)輸出小數(shù)幾位

    c語(yǔ)言double類型默認(rèn)輸出小數(shù)幾位

    在本篇文章里小編給大家分享的是關(guān)于c語(yǔ)言double類型默認(rèn)輸出小數(shù)幾位的相關(guān)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。
    2020-04-04
  • 淺析如何在c語(yǔ)言中調(diào)用Linux腳本

    淺析如何在c語(yǔ)言中調(diào)用Linux腳本

    如何在c語(yǔ)言中調(diào)用Linux腳本呢?下面小編就為大家詳細(xì)的介紹一下吧!需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • C語(yǔ)言實(shí)現(xiàn)自動(dòng)發(fā)牌程序

    C語(yǔ)言實(shí)現(xiàn)自動(dòng)發(fā)牌程序

    這篇文章主要介紹了利用C語(yǔ)言實(shí)現(xiàn)自動(dòng)發(fā)牌程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 單元測(cè)試代碼覆蓋率解析

    單元測(cè)試代碼覆蓋率解析

    單元測(cè)試(unit testing),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。動(dòng)態(tài)分析就是通過(guò)觀察軟件運(yùn)行時(shí)的動(dòng)作,來(lái)提供執(zhí)行跟蹤,時(shí)間分析,以及測(cè)試覆蓋度方面的信息。下面我們來(lái)詳細(xì)了解下吧
    2019-06-06
  • C/C++ 常用排序算法整理匯總分享

    C/C++ 常用排序算法整理匯總分享

    排序算法,就是如何使得記錄按照要求排列的方法。排序算法在很多領(lǐng)域得到相當(dāng)?shù)刂匾?,尤其是在大量?shù)據(jù)的處理方面。一個(gè)優(yōu)秀的算法可以節(jié)省大量的資源。本篇整理了c語(yǔ)言和c++的常用的排序算法,感興趣的朋友可以參考下
    2021-06-06
  • C++中double浮點(diǎn)數(shù)精度丟失的深入分析

    C++中double浮點(diǎn)數(shù)精度丟失的深入分析

    這篇文章主要給大家介紹了關(guān)于C++中double浮點(diǎn)數(shù)精度丟失的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++虛析構(gòu)函數(shù)的使用分析

    C++虛析構(gòu)函數(shù)的使用分析

    本篇文章是對(duì)C++虛析構(gòu)函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn)小型圖書管理系統(tǒng)

    C++實(shí)現(xiàn)小型圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)小型圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Qt6.3 + Clion +MSVC2019環(huán)境配置詳解

    Qt6.3 + Clion +MSVC2019環(huán)境配置詳解

    本文主要介紹了Qt6.3 + Clion +MSVC2019環(huán)境配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 用C語(yǔ)言實(shí)現(xiàn)三子棋

    用C語(yǔ)言實(shí)現(xiàn)三子棋

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)三子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評(píng)論

龙陵县| 团风县| 东乡族自治县| 安溪县| 泸定县| 石嘴山市| 鞍山市| 饶平县| 古交市| 花莲县| 宁城县| 塔城市| 辰溪县| 炎陵县| 抚顺市| 永清县| 汉阴县| 常山县| 和平区| 昌吉市| 措勤县| 井冈山市| 如东县| 喜德县| 淮南市| 昌都县| 班戈县| 保康县| 定远县| 翼城县| 邻水| 台州市| 余庆县| 晋城| 姜堰市| 晋宁县| 金门县| 临颍县| 惠水县| 墨玉县| 海门市|