天天看點

CMake入門2——複雜項目的建構配置例4 多檔案單目錄測試例5 多檔案單子目錄測試例6 多目錄和多級目錄測試

  • 例4 多檔案單目錄測試
  • 例5 多檔案單子目錄測試
  • 例6 多目錄和多級目錄測試

CMake入門1——CMake與VS編譯器和nmake的結合使用

例4 多檔案單目錄測試

此測試項目将所有的檔案都放在根目錄下。

在CMakeTest目錄下建立demo4目錄。demo4項目檔案清單如下:

CMake入門2——複雜項目的建構配置例4 多檔案單目錄測試例5 多檔案單子目錄測試例6 多目錄和多級目錄測試

其中實作了算術運算的加減乘除,每個功能分别實作在各自的檔案中:

int my_add(int a, int b);
int my_minus(int a, int b);
int my_multiply(int a, int b);
int my_divide(int a, int b);
           

然後在main.cpp中調用各個函數,代碼如下:

#include <iostream>
using namespace std;

#include "add.h"
#include "minus.h"
#include "multiply.h"
#include "divide.h"

void main()
{
    cout<<"cmake test demo 4"<<endl;

    int a=;
    int b=;
    cout<<a<<"+"<<b<<"="<<my_add(a, b)<<endl;
    cout<<a<<"-"<<b<<"="<<my_minus(a, b)<<endl;
    cout<<a<<"*"<<b<<"="<<my_multiply(a, b)<<endl;
    cout<<a<<"/"<<b<<"="<<my_divide(a, b)<<endl;

    getchar();
}
           

CMakeLists.txt檔案内容如下:

# CMake最低版本要求,如果低于3.10.1版本,則建構過程會被終止 
cmake_minimum_required(VERSION .)

# 項目資訊
project(demo4)

# 查找目前目錄下的所有源檔案,并将名稱儲存到DIR_SRCS變量中
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(demo ${DIR_SRCS})
           

此配置檔案中使用了一條新指令:

  • aux_source_directory:該指令會查找指定目錄下的所有源檔案,然後将結果存進指定變量名。這樣,就不用在add_executable中列出所有源檔案了,而是直接引用變量即可。

從VC指令行進入到demo4目錄,然後執行cmake指令和nmake指令,即可編譯出執行程式。

CMake入門2——複雜項目的建構配置例4 多檔案單目錄測試例5 多檔案單子目錄測試例6 多目錄和多級目錄測試

例5 多檔案單子目錄測試

此測試項目将main入口函數文放在根目錄下,其他檔案放在獨立目錄下。

建立demo5目錄,使用例3中的項目檔案,将main.cpp放在demo5目錄下,将其他的加減乘除的相關檔案放在math子目錄下。然後在demo5目錄和math目錄下分别放一個CMakeLists.txt檔案。

CMake入門2——複雜項目的建構配置例4 多檔案單目錄測試例5 多檔案單子目錄測試例6 多目錄和多級目錄測試
CMake入門2——複雜項目的建構配置例4 多檔案單目錄測試例5 多檔案單子目錄測試例6 多目錄和多級目錄測試

其中demo5目錄下的CMakeLists.txt檔案内容如下:

# CMake最低版本要求,如果低于3.10.1版本,則建構過程會被終止 
cmake_minimum_required(VERSION .)

# 項目資訊
project(demo5)

# 添加頭檔案目錄
include_directories(math)

# 查找目前目錄下的所有源檔案,并将名稱儲存到DIR_SRCS變量中
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(demo ${DIR_SRCS})

# 添加math子目錄
add_subdirectory(math)

# 添加連結庫
target_link_libraries(demo math)
           

在這個配置檔案中,依次出現了幾條新的cmake指令:

  • include_directories:頭檔案包含目錄,因為main.cpp中使用了加減乘除函數,是以需要指明頭檔案目錄所在之處。當然,也可以在main.cpp中包含都檔案時指定目錄
  • add_subdirectory:添加子目錄指令,表示需要編譯該子目錄
  • target_link_libraries:添加要依賴的庫檔案,此處的math庫是在子目錄math中編譯出來的

math目錄下的CMakeLists.txt檔案内容如下:

# CMake最低版本要求,如果低于3.10.1版本,則建構過程會被終止 
cmake_minimum_required(VERSION .)

# 查找目前目錄下的所有源檔案,并将名稱儲存到DIR_SRCS變量中
aux_source_directory(. DIR_LIB_SRCS)

# 指定生成目标
add_library(math ${DIR_LIB_SRCS})
           

在上面這個配置檔案中,出現了一條新指令:

  • add_library:将指定的檔案編譯為庫,前面是庫名稱,後面是源檔案

進demo5目錄,然後執行cmake指令和nmake指令,即可編譯出執行程式。可以看到,在math子目錄下生成了一個”math.lib”的庫檔案。

例6 多目錄和多級目錄測試

本例子demo6中把加減乘除四個運算分散在不同的目錄下,形成了多個目錄、多級目錄的形式。具體的檔案布局如下圖所示:

CMake入門2——複雜項目的建構配置例4 多檔案單目錄測試例5 多檔案單子目錄測試例6 多目錄和多級目錄測試

多個子目錄和多級目錄在用cmake來建構時的一種方式是:将所有源檔案按功能或目錄來分别建構為庫,然後在需要用到庫的地方連結上所需的一個或多個庫。

對于此例來說,各目錄的說明和建構方式如下:

  • demo6根目錄下包括了math和divide兩個目錄;
  • divide目錄是除法目錄,由其目錄中的配置檔案單獨建構為一個庫;
  • math目錄包括了add_minus和multiply兩個目錄;
  • add_minus目錄包括加法的實作檔案和減法目錄minus;
  • 減法不單獨建構為庫,而是和加法一起,用add_minus中的配置檔案建構為一個庫;
  • 乘法的庫也不再它自己的目錄中建構,而是在math目錄下建構為單獨的乘法庫;
  • 最後,在demo6根目錄下的配置檔案中建構demo.exe程式,并連接配接了乘法庫、除法庫、加減法合在一起的庫;

首先,divide目錄下建構除法庫的配置檔案比較簡單,使用了

aux_source_directory

add_library

兩條指令。

# CMake最低版本要求,如果低于3.10.1版本,則建構過程會被終止 
cmake_minimum_required(VERSION .)

# 查找目前目錄下的所有源檔案,并将名稱儲存到DIR_LIB_DIVIDE_SRCS變量中
aux_source_directory(. DIR_LIB_DIVIDE_SRCS)

# 指定生成目标
add_library(lib_divide ${DIR_LIB_DIVIDE_SRCS})
           

其次,加減法庫的建構如下:

# CMake最低版本要求,如果低于3.10.1版本,則建構過程會被終止 
cmake_minimum_required(VERSION .)

# 查找目前目錄下的所有源檔案,并将名稱儲存到DIR_MINUS_SRCS變量中
aux_source_directory(./minus DIR_MINUS_SRCS)
# 把要編譯的檔案都列在此處,存入ADD_SRCS變量中
set(ADD_SRCS add.cpp)

# 指定生成目标
add_library(lib_add_minus ${ADD_SRCS} ${DIR_MINUS_SRCS})
           

這個也很簡單,隻是有3點小改變:

  • aux_source_directory指令中指定的目錄為

    ./minus

    ,表示目前檔案夾下的

    minus

    子目錄,也就是把

    minus

    子目錄下的減法源檔案存在了

    DIR_MINUS_SRCS

    變量中
  • 使用了一條新的指令set,這也是一條用來設定變量的,不過變量放在前面,變量的值放在後面。這裡指定為将目前目錄下的加法實作源檔案存入變量

    ADD_SRCS

    中。需注意的是,後面的檔案可以列出多個各處的檔案
  • 在add_library指令将前面的兩個儲存了加法和減法源檔案的變量一起用來生成一個庫

    lib_add_minus

再次,

math

目錄下的配置檔案如下:

# CMake最低版本要求,如果低于3.10.1版本,則建構過程會被終止 
cmake_minimum_required(VERSION )

# 添加子目錄
add_subdirectory(add_minus)

# 把要編譯的檔案都列在此處,存入DIR_MULTIPLY_SRC變量中
set(DIR_MULTIPLY_SRC multiply/multiply.cpp)

# 指定生成目标
add_library(lib_multiply ${DIR_MULTIPLY_SRC})
           

在這個配置檔案中,将

multiply

目錄下的乘法編譯成了單獨的一個庫,然後添加了

add_minus

子目錄。所用的指令都是已使用過的。

最後,根目錄

demo6

下的配置檔案如下:

# CMake最低版本要求,如果低于3.10.1版本,則建構過程會被終止 
cmake_minimum_required(VERSION .)

# 項目資訊
project(demo6)

# 添加頭檔案目錄
include_directories(math/add_minus math/add_minus/minus math/multiply)
include_directories(divide)

# 查找目前目錄下的所有源檔案,并将名稱儲存到DIR_SRCS變量中
aux_source_directory(. DIR_SRCS)

# 指定生成目标
add_executable(demo ${DIR_SRCS})

# 添加math子目錄
add_subdirectory(math)
# 添加divide子目錄
add_subdirectory(divide)

# 添加連結庫
target_link_libraries(demo lib_add_minus)
target_link_libraries(demo lib_multiply lib_divide)
           

在這個配置檔案中,有幾點小說明:

  • 這個根目錄下的配置檔案為cmake的入口配置檔案,是以在其中指定了最低版本。這樣其實在子目錄下的配置檔案中就可以不用再用

    cmake_minimum_required

    指令了
  • include_directories

    指令指明了頭檔案所在目錄,一條指令中可以指定多個頭檔案包含目錄。在實際項目中可将頭檔案提取到一個目錄中,然後指定一個目錄就可以了
  • add_subdirectory

    指明了

    divide

    math

    兩個子目錄
  • target_link_libraries

    将各個庫連接配接到目标程式”demo”中,此指令也可以一次指定多個庫

至此,所有的工作就做好了,在指令下執行cmake指令和nmake指令,就可編譯出執行程式。同時可以看到,在math子目錄下生成了一個”lib_multiply.lib”庫,在math/add_minus目錄下生成了一個lib_add_minus.lib庫,在divide目錄下生成了lib_divide庫。

繼續閱讀