GNU开发工具:CMake快速入门教程(2)

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

#CMake最低版本号要求
cmake_minimum_required(VERSION 2.8)
#项目信息
project(demo)
#指定生成目标
add_executable(demomain.cpp MathFunctions.cpp)

add_executable命令中增加了一个MathFunctions.cpp源文件,但如果源文件很多,可以使用aux_source_directory命令,aux_source_directory命令会查找指定目录下的所有源文件,然后将结果存进指定变量名。其语法如下:
aux_source_directory(dir variable)
修改后CMakeLists.txt如下:

#CMake最低版本号要求
cmake_minimum_required(VERSION 2.8)
# 项目信息
project(demo)
#查找当前目录下的所有源文件
#并将名称保存到DIR_SRCS变量
aux_source_directory(. DIR_SRCS)
#指定生成目标
add_executable(demo${DIR_SRCS})

CMake会将当前目录所有源文件的文件名赋值给变量DIR_SRCS ,再指示变量DIR_SRCS中的源文件需要编译成一个名称为demo的可执行文件。

五、多文件多目录工程 1、源码文件编写

创建一个math目录,将MathFunctions.h和MathFunctions.cpp文件移动到math目录下。在工程目录根目录test和子目录math里各编写一个CMakeLists.txt文件,可以先将math目录里的文件编译成静态库再由main函数调用。

GNU开发工具:CMake快速入门教程


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文件编写

根目录的CMakeLists.txt文件:

# CMake最低版本号要求
cmake_minimum_required(VERSION 2.8)
# 项目信息
project(demo)
#查找当前目录下的所有源文件
#并将名称保存到DIR_SRCS变量
aux_source_directory(. DIR_SRCS)
#添加math子目录
add_subdirectory(math)
#指定生成目标
add_executable(demo${DIR_SRCS})
# 添加链接库
target_link_libraries(demoMathFunctions)

add_subdirectory命令指明本工程包含一个子目录math,math目录下的 CMakeLists.txt文件和源代码也会被处理 。target_link_libraries命令指明可执行文件demo需要连接一个名为MathFunctions的链接库 。
math子目录的CMakeLists.txt文件:

#查找当前目录下的所有源文件
#并将名称保存到DIR_LIB_SRCS变量
aux_source_directory(. DIR_LIB_SRCS)
#生成链接库
add_library(MathFunctions ${DIR_LIB_SRCS})

add_library命令将math目录中的源文件编译为静态链接库。

六、自定义编译选项 1、自定义编译选项简介

CMake允许为工程增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案。
例如,可以将MathFunctions库设为一个可选的库,如果该选项为ON ,就使用MathFunctions库定义的数学函数来进行运算,否则就调用标准库中的数学函数库。

2、CMakeLists 文件编写

在根目录的CMakeLists.txt文件指定自定义编译选项:

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (demo)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 加入一个配置头文件,用于处理 CMake 对源码的设置
configure_file (
  "${PROJECT_SOURCE_DIR}/config.h.in"
  "${PROJECT_BINARY_DIR}/config.h"
  )
# 是否使用自己的MathFunctions库
option (USE_MYMATH
          "Use provided math implementation" ON)
# 是否加入 MathFunctions 库
if (USE_MYMATH)
  include_directories ("${PROJECT_SOURCE_DIR}/math")
  add_subdirectory (math)
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/12514.html