欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

GNU開(kāi)發(fā)工具——CMake快速入門(mén)

GNU開(kāi)發(fā)工具——CMake快速入門(mén)

一、CMake簡(jiǎn)介

不同Make工具,如GNU Make、QT的qmake、微軟的MS nmake、BSD Make(pmake)等,遵循著不同的規(guī)范和標(biāo)準(zhǔn),所執(zhí)行的Makefile格式也不同。如果軟件想跨平臺(tái),必須要保證能夠在不同平臺(tái)編譯。而如果使用Make工具,必須為不同的Make工具編寫(xiě)不同的Makefile。
CMake是一個(gè)比Make工具更高級(jí)的編譯配置工具,是一個(gè)跨平臺(tái)的、開(kāi)源的構(gòu)建系統(tǒng)(BuildSystem)。CMake允許開(kāi)發(fā)者編寫(xiě)一種平臺(tái)無(wú)關(guān)的CMakeList.txt文件來(lái)定制整個(gè)編譯流程,然后再根據(jù)目標(biāo)用戶的平臺(tái)進(jìn)一步生成所需的本地化Makefile和工程文件,如:為Unix平臺(tái)生成Makefile文件(使用GCC編譯),為Windows MSVC生成projects/workspaces(使用VS IDE編譯)或Makefile文件(使用nmake編譯)。使用CMake作為項(xiàng)目架構(gòu)系統(tǒng)的知名開(kāi)源項(xiàng)目有VTK、ITK、KDE、OpenCV、OSG等。

目前成都創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機(jī)、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、肇慶網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

二、CMake管理工程

在Linux平臺(tái)下使用CMake生成Makefile并編譯的流程如下:
A、編寫(xiě)CMake配置文件CMakeLists.txt
B、執(zhí)行命令cmake PATH生成Makefile,PATH是CMakeLists.txt所在的目錄。
C、使用make命令進(jìn)行編譯。

三、單個(gè)源文件工程

1、源文件編寫(xiě)

假設(shè)項(xiàng)目test中只有一個(gè)main.cpp源文件,程序用途是計(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;
}

2、編寫(xiě)CMakeLists.txt

在main.cpp源文件目錄test下編寫(xiě)CMakeLists.txt文件。

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

CMakeLists.txt由命令、注釋和空格組成,其中命令是不區(qū)分大小寫(xiě)。符號(hào)#后的內(nèi)容被認(rèn)為是注釋。命令由命令名稱、小括號(hào)和參數(shù)組成,參數(shù)之間使用空格進(jìn)行間隔。
本例中CMakeLists.txt文件的命令如下:
cmake_minimum_required:指定運(yùn)行本配置文件所需的CMake的最低版本;
project:參數(shù)值是demo,表示項(xiàng)目的名稱是demo。
add_executable:將名為main.cpp的源文件編譯成一個(gè)名稱為demo的可執(zhí)行文件。

3、編譯工程

在源碼根目錄下創(chuàng)建一個(gè)build目錄,進(jìn)入build目錄,執(zhí)行cmake ..,生成Makefile,再使用make命令編譯得到demo可執(zhí)行文件。
通常,建議在源碼根目錄下創(chuàng)建一個(gè)獨(dú)立的build構(gòu)建編譯目錄,將構(gòu)建過(guò)程產(chǎn)生的臨時(shí)文件等文件與源碼隔離,避免源碼被污染。

四、單目錄多源文件工程

1、源文件編寫(xiě)

假如把power函數(shù)單獨(dú)寫(xiě)進(jìn)一個(gè)名為MathFunctions.cpp的源文件里,使得這個(gè)工程變成如下的形式:
GNU開(kāi)發(fā)工具——CMake快速入門(mén)
MathFunctions.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);

MathFunctions.cpp文件:

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;
}

main.cpp文件:

#include <stdio.h>
#include <stdlib.h>
#include "MathFunctions.h"

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;
}

2、編寫(xiě)CMakeLists.txt

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

add_executable命令中增加了一個(gè)MathFunctions.cpp源文件,但如果源文件很多,可以使用aux_source_directory命令,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(demo)
#查找當(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í)行文件。

五、多文件多目錄工程

1、源碼文件編寫(xiě)

創(chuàng)建一個(gè)math目錄,將MathFunctions.h和MathFunctions.cpp文件移動(dòng)到math目錄下。在工程目錄根目錄test和子目錄math里各編寫(xiě)一個(gè)CMakeLists.txt文件,可以先將math目錄里的文件編譯成靜態(tài)庫(kù)再由main函數(shù)調(diào)用。
GNU開(kāi)發(fā)工具——CMake快速入門(mén)
math子目錄:
MathFunctions.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);

MathFunctions.cpp文件:

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;
}

根目錄源文件:

#include <stdio.h>
#include <stdlib.h>
#include "math/MathFunctions.h"

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;
}

2、CMakeLists.txt文件編寫(xiě)

根目錄的CMakeLists.txt文件:

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

add_subdirectory命令指明本工程包含一個(gè)子目錄math,math目錄下的 CMakeLists.txt文件和源代碼也會(huì)被處理 。target_link_libraries命令指明可執(zhí)行文件demo需要連接一個(gè)名為MathFunctions的鏈接庫(kù) 。
math子目錄的CMakeLists.txt文件:

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

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

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

1、自定義編譯選項(xiàng)簡(jiǎn)介

CMake允許為工程增加編譯選項(xiàng),從而可以根據(jù)用戶的環(huán)境和需求選擇最合適的編譯方案。
例如,可以將MathFunctions庫(kù)設(shè)為一個(gè)可選的庫(kù),如果該選項(xiàng)為ON ,就使用MathFunctions庫(kù)定義的數(shù)學(xué)函數(shù)來(lái)進(jìn)行運(yùn)算,否則就調(diào)用標(biāo)準(zhǔn)庫(kù)中的數(shù)學(xué)函數(shù)庫(kù)。

2、CMakeLists 文件編寫(xiě)

在根目錄的CMakeLists.txt文件指定自定義編譯選項(xiàng):

# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (demo)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 加入一個(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})

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

3、修改源文件的調(diào)用

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

#include <cstdio>
#include <cstdlib>
#include <config.h>

#ifdef USE_MYMATH
#include <MathFunctions.h>
#else
#include <cmath>
#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;
}

4、編寫(xiě)config.h.in文件

main.cpp文件包含了一個(gè)config.h文件,config.h文件預(yù)定義了USE_MYMATH 的值。但不會(huì)直接編寫(xiě)config.h文件,為了方便從CMakeLists.txt中導(dǎo)入配置,通常編寫(xiě)一個(gè)config.h.in文件,內(nèi)容如下:
#cmakedefine USE_MYMATH
CMake會(huì)自動(dòng)根據(jù)CMakeLists.txt配置文件中的設(shè)置自動(dòng)生成config.h文件。

5、編譯工程

修改CMakeLists.txt文件,USE_MYMATH為OFF,使用標(biāo)準(zhǔn)庫(kù)。

# 是否使用自己的MathFunctions庫(kù)
option (USE_MYMATH
           "Use provided math implementation" OFF)

在build目錄下cmake ..,make,執(zhí)行程序:
GNU開(kāi)發(fā)工具——CMake快速入門(mén)

七、安裝和測(cè)試

1、定制安裝規(guī)則

在math/CMakeLists.txt文件指定MathFunctions庫(kù)的安裝規(guī)則:

#指定MathFunctions庫(kù)的安裝路徑
install(TARGETS MathFunctions DESTINATION bin)
install(FILES MathFunctions.h DESTINATION include)

修改根目錄的CMakeLists.txt文件指定目標(biāo)文件的安裝規(guī)則:

#指定安裝路徑
install(TARGETS test DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/config.h"
         DESTINATION include)

通過(guò)對(duì)安裝規(guī)則的定制,生成的目標(biāo)文件和MathFunctions函數(shù)庫(kù) libMathFunctions.o文件將會(huì)被拷貝到/usr/local/bin中,而MathFunctions.h和生成的config.h文件則會(huì)被復(fù)制到/usr/local/include中。
/usr/local是默認(rèn)安裝到的根目錄,可以通過(guò)修改 CMAKE_INSTALL_PREFIX 變量的值來(lái)指定文件應(yīng)該拷貝到哪個(gè)根目錄。

2、為工程添加測(cè)試

CMake提供了一個(gè)CTest測(cè)試工具。在項(xiàng)目根目錄的CMakeLists.txt文件中調(diào)用一系列的add_test 命令。

     #啟用測(cè)試
     enable_testing()
     #測(cè)試程序是否成功運(yùn)行
     add_test(test_run demo 5 2)
     #測(cè)試幫助信息是否可以正常提示
     add_test(test_usage demo)
     set_tests_properties(test_usage
       PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")
     #測(cè)試5的平方
     add_test(test_5_2 demo 5 2)
     set_tests_properties(test_5_2
      PROPERTIES PASS_REGULAR_EXPRESSION "is 25")
     #測(cè)試10的5次方
     add_test(test_10_5 demo 10 5)
     set_tests_properties(test_10_5
      PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")
     #測(cè)試2的10次方
     add_test(test_2_10 demo 2 10)
     set_tests_properties(test_2_10
      PROPERTIES PASS_REGULAR_EXPRESSION "is 1024")

GNU開(kāi)發(fā)工具——CMake快速入門(mén)
第一個(gè)測(cè)試test_run用來(lái)測(cè)試程序是否成功運(yùn)行并返回0值。剩下的三個(gè)測(cè)試分別用來(lái)測(cè)試 5 的 平方、10 的 5 次方、2 的 10 次方是否都能得到正確的結(jié)果。其中PASS_REGULAR_EXPRESSION用來(lái)測(cè)試輸出是否包含后面跟著的字符串。
如果要測(cè)試更多的輸入數(shù)據(jù),可以通過(guò)編寫(xiě)宏來(lái)實(shí)現(xiàn):

# 啟用測(cè)試
     enable_testing()

     # 測(cè)試程序是否成功運(yùn)行
     add_test (test_run demo 5 2)

     # 測(cè)試幫助信息是否可以正常提示
     add_test (test_usage demo)
     set_tests_properties (test_usage
       PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")

     # 測(cè)試 5 的平方
     # add_test (test_5_2 Demo 5 2)

     # set_tests_properties (test_5_2
     #  PROPERTIES PASS_REGULAR_EXPRESSION "is 25")

     # 測(cè)試 10 的 5 次方
     # add_test (test_10_5 Demo 10 5)

     # set_tests_properties (test_10_5
     #  PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")

     # 測(cè)試 2 的 10 次方
     # add_test (test_2_10 Demo 2 10)

     # set_tests_properties (test_2_10
     #  PROPERTIES PASS_REGULAR_EXPRESSION "is 1024")

     # 定義一個(gè)宏,用來(lái)簡(jiǎn)化測(cè)試工作
     macro (do_test arg1 arg2 result)
       add_test (test_${arg1}_${arg2} demo ${arg1} ${arg2})
       set_tests_properties (test_${arg1}_${arg2}
         PROPERTIES PASS_REGULAR_EXPRESSION ${result})
     endmacro (do_test)

     # 利用 do_test 宏,測(cè)試一系列數(shù)據(jù)
     do_test (5 2 "is 25")
     do_test (10 5 "is 100000")
     do_test (2 10 "is 1024")

GNU開(kāi)發(fā)工具——CMake快速入門(mén)

八、GDB支持

讓CMake支持gdb的設(shè)置只需要指定Debug模式下開(kāi)啟-g選項(xiàng):

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

生成的程序可以直接使用gdb來(lái)調(diào)試。

九、添加環(huán)境檢查

使用平臺(tái)相關(guān)的特性時(shí),需要對(duì)系統(tǒng)環(huán)境做檢查。檢查系統(tǒng)是否自帶pow函數(shù),如果有pow函數(shù),就使用;否則使用自定義的power函數(shù)。

1、添加 CheckFunctionExists 宏

首先在頂層CMakeLists.txt文件中添加CheckFunctionExists.cmake 宏,并調(diào)用check_function_exists命令測(cè)試鏈接器是否能夠在鏈接階段找到 pow函數(shù)。

#檢查系統(tǒng)是否支持 pow 函數(shù)
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)
check_function_exists需要放在configure_file命令前。

2、預(yù)定義相關(guān)宏變量

修改 config.h.in 文件,預(yù)定義相關(guān)的宏變量。

// does the platform provide pow function?
#cmakedefine HAVE_POW

3、在代碼中使用宏和函數(shù)

修改 main.cpp文件 ,在代碼中使用宏和函數(shù)。

#include <stdio.h>
#include <stdlib.h>
#include <config.h>

#ifdef HAVE_POW
#include <math.h>
#else
#include <MathFunctions.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 HAVE_POW
    printf("Now we use the standard library. \n");
    double result = pow(base, exponent);
#else
    printf("Now we use our own Math library. \n");
    double result = power(base, exponent);
#endif

    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

十、添加版本號(hào)

修改頂層CMakeLists.txt文件,在project命令后分別指定當(dāng)前的項(xiàng)目的主版本號(hào)和副版本號(hào)。

# CMake 最低版本號(hào)要求
cmake_minimum_required (VERSION 2.8)
# 項(xiàng)目信息
project (demo)

set (Demo_VERSION_MAJOR 1)
set (Demo_VERSION_MINOR 0)

set(CMAKE_INCLUDE_CURRENT_DIR ON)

#檢查系統(tǒng)是否支持 pow 函數(shù)
include (${CMAKE_ROOT}/Modules/CheckFunctionExists.cmake)
check_function_exists (pow HAVE_POW)

# 加入一個(gè)配置頭文件,用于處理 CMake 對(duì)源碼的設(shè)置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )

# 是否加入 MathFunctions 庫(kù)
if (NOT HAVE_POW)
  include_directories ("${PROJECT_SOURCE_DIR}/math")
  add_subdirectory (math)
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (NOT HAVE_POW)

# 查找當(dāng)前目錄下的所有源文件
# 并將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
# 指定生成目標(biāo)
add_executable (demo ${DIR_SRCS})
target_link_libraries (demo  ${EXTRA_LIBS})

#指定安裝路徑
install(TARGETS demo DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/config.h"
         DESTINATION include)

     # 啟用測(cè)試
     enable_testing()

     # 測(cè)試程序是否成功運(yùn)行
     add_test (test_run demo 5 2)

     # 測(cè)試幫助信息是否可以正常提示
     add_test (test_usage demo)
     set_tests_properties (test_usage
       PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")

     # 測(cè)試 5 的平方
     # add_test (test_5_2 Demo 5 2)

     # set_tests_properties (test_5_2
     #  PROPERTIES PASS_REGULAR_EXPRESSION "is 25")

     # 測(cè)試 10 的 5 次方
     # add_test (test_10_5 Demo 10 5)

     # set_tests_properties (test_10_5
     #  PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")

     # 測(cè)試 2 的 10 次方
     # add_test (test_2_10 Demo 2 10)

     # set_tests_properties (test_2_10
     #  PROPERTIES PASS_REGULAR_EXPRESSION "is 1024")

     # 定義一個(gè)宏,用來(lái)簡(jiǎn)化測(cè)試工作
     macro (do_test arg1 arg2 result)
       add_test (test_${arg1}_${arg2} demo ${arg1} ${arg2})
       set_tests_properties (test_${arg1}_${arg2}
         PROPERTIES PASS_REGULAR_EXPRESSION ${result})
     endmacro (do_test)

     # 利用 do_test 宏,測(cè)試一系列數(shù)據(jù)
     do_test (5 2 "is 25")
     do_test (10 5 "is 100000")
     do_test (2 10 "is 1024")

分別指定當(dāng)前的項(xiàng)目的主版本號(hào)和副版本號(hào)。
為了在代碼中獲取版本信息,可以修改 config.h.in 文件,添加兩個(gè)預(yù)定義變量:

// the configured options and settings for Tutorial
#define Demo_VERSION_MAJOR @Demo_VERSION_MAJOR@
#define Demo_VERSION_MINOR @Demo_VERSION_MINOR@

// does the platform provide pow function?
#cmakedefine HAVE_POW

直接在源碼中使用:

#include <stdio.h>
#include <stdlib.h>
#include <config.h>

#ifdef HAVE_POW
#include <math.h>
#else
#include <MathFunctions.h>
#endif

int main(int argc, char *argv[])
{
    if (argc < 3)
    {
        // print version info
        printf("%s Version %d.%d\n",
               argv[0],
               Demo_VERSION_MAJOR,
               Demo_VERSION_MINOR);
        printf("Usage: %s base exponent \n", argv[0]);
        return 1;
    }

    double base = atof(argv[1]);
    int exponent = atoi(argv[2]);

#ifdef HAVE_POW
    printf("Now we use the standard library. \n");
    double result = pow(base, exponent);
#else
    printf("Now we use our own Math library. \n");
    double result = power(base, exponent);
#endif

    printf("%g ^ %d is %g\n", base, exponent, result);
    return 0;
}

十一、生成安裝包

1、增加CPack模塊

CMake提供了一個(gè)專門(mén)用于打包的工具CPack,用于配置生成各種平臺(tái)上的安裝包,包括二進(jìn)制安裝包和源碼安裝包。
首先在頂層的CMakeLists.txt文件尾部添加下面幾行:

# 構(gòu)建一個(gè) CPack 安裝包
include (InstallRequiredSystemLibraries)
set (CPACK_RESOURCE_FILE_LICENSE
  "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set (CPACK_PACKAGE_VERSION_MAJOR "${Demo_VERSION_MAJOR}")
set (CPACK_PACKAGE_VERSION_MINOR "${Demo_VERSION_MINOR}")
include (CPack)

導(dǎo)入InstallRequiredSystemLibraries模塊,便于導(dǎo)入CPack模塊;
設(shè)置一些CPack相關(guān)變量,包括版權(quán)信息和版本信息
導(dǎo)入CPack模塊。
在頂層目錄下創(chuàng)建License.txt文件內(nèi)如如下:

The MIT License (MIT)

Copyright (c) 2018 Scorpio Studio

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

2、生成安裝包

生成二進(jìn)制安裝包:
cpack -C CPackConfig.cmake
生成源碼安裝包:
cpack -C CPackSourceConfig.cmake
上述兩個(gè)命令都會(huì)在目錄下創(chuàng)建3個(gè)不同格式的二進(jìn)制包文件:
demo-1.0.1-Linux.tar.gz
demo-1.0.1-Linux.tar.Z
demo-1.0.1-Linux.sh
3個(gè)二進(jìn)制包文件所包含的內(nèi)容是完全相同的。

新聞名稱:GNU開(kāi)發(fā)工具——CMake快速入門(mén)
分享路徑:http://aaarwkj.com/article42/isjphc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、服務(wù)器托管、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷(xiāo)、微信公眾號(hào)、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司
99热在线精品国产观看| 欧美中文字幕精在线不卡| 久久久久亚洲av成人| 亚洲男人天堂超碰在线| 亚洲免费av第一区第二区| 亚洲综合色一区二区三区四区| 91午夜福利偷拍视频| 欧美日韩国产成人一区| 97资源在线中文一区| 亚洲一区二区三区免费观看视频| 国内精品一区二区欧美| 国产精品白嫩初高中害羞小美女| 久久色综合色悠悠色综合色| 国产亚洲欧美日韩精品| 国产成人在线免费短视频| 国产精品欧美久久久久无| 日本一级二级三级在线看| 一级黄片一区二区三区| 黄色片一区二区三区四区| 国产高清剧情av网站| 色呦呦视频在线免费观看| 亚洲国产一区二区高清| 91美女黑丝免费国产视频 | 91麻豆成人精品国产| 亚洲黄香蕉视频免费看| 夫妻性生活免费的视频| 欧美亚洲另类色自拍偷拍| 婷婷丁香六月激情综合| 欧美视频综合一级91| 中文字幕日韩有码在线| 毛片91成人在线播放| 亚洲高清中文字幕专区| 91精品国产91久久综合桃花| 国产亚洲一区二区视频| 精品亚洲国产成人av| 一区二区三区人妻日韩| 国产一级夫妻性生活欧美| 日韩爱爱特级视频中文字幕| 国产av超爽剧情系列| 亚洲五月综合激情综合久久| 亚洲国产成人综合一区二区三区|