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

# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable (demo${DIR_SRCS})
target_link_libraries (demo  ${EXTRA_LIBS})

configure_file命令用于加入一个配置头文件config.h,config.h文件由CMake从config.h.in生成,通过预定义一些参数和变量来控制代码的生成。
option命令添加了一个USE_MYMATH选项,并且默认值为ON。
根据USE_MYMATH变量的值来决定是否使用自己编写的MathFunctions库。

3、修改源文件的调用

修改main.cpp文件,让其根据USE_MYMATH的预定义值来决定是否调用标准库还是MathFunctions库。

#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、编写config.h.in文件

main.cpp文件包含了一个config.h文件,config.h文件预定义了USE_MYMATH 的值。但不会直接编写config.h文件,为了方便从CMakeLists.txt中导入配置,通常编写一个config.h.in文件,内容如下:
#cmakedefine USE_MYMATH
CMake会自动根据CMakeLists.txt配置文件中的设置自动生成config.h文件。

5、编译工程

修改CMakeLists.txt文件,USE_MYMATH为OFF,使用标准库。

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

在build目录下cmake ..,make,执行程序:

七、安装和测试 1、定制安装规则

在math/CMakeLists.txt文件指定MathFunctions库的安装规则:

#指定MathFunctions库的安装路径
install(TARGETS MathFunctions DESTINATION bin)
install(FILES MathFunctions.h DESTINATION include)

修改根目录的CMakeLists.txt文件指定目标文件的安装规则:

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

通过对安装规则的定制,生成的目标文件和MathFunctions函数库 libMathFunctions.o文件将会被拷贝到/usr/local/bin中,而MathFunctions.h和生成的config.h文件则会被复制到/usr/local/include中。
/usr/local是默认安装到的根目录,可以通过修改 CMAKE_INSTALL_PREFIX 变量的值来指定文件应该拷贝到哪个根目录。

2、为工程添加测试

CMake提供了一个CTest测试工具。在项目根目录的CMakeLists.txt文件中调用一系列的add_test 命令。

#启用测试
    enable_testing()
    #测试程序是否成功运行
    add_test(test_run demo 5 2)
    #测试帮助信息是否可以正常提示
    add_test(test_usage demo)
    set_tests_properties(test_usage
      PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")
    #测试5的平方
    add_test(test_5_2 demo 5 2)
    set_tests_properties(test_5_2
      PROPERTIES PASS_REGULAR_EXPRESSION "is 25")
    #测试10的5次方
    add_test(test_10_5 demo 10 5)
    set_tests_properties(test_10_5
      PROPERTIES PASS_REGULAR_EXPRESSION "is 100000")
    #测试2的10次方
    add_test(test_2_10 demo 2 10)
    set_tests_properties(test_2_10
      PROPERTIES PASS_REGULAR_EXPRESSION "is 1024")

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


第一个测试test_run用来测试程序是否成功运行并返回0值。剩下的三个测试分别用来测试 5 的 平方、10 的 5 次方、2 的 10 次方是否都能得到正确的结果。其中PASS_REGULAR_EXPRESSION用来测试输出是否包含后面跟着的字符串。
如果要测试更多的输入数据,可以通过编写宏来实现:

# 启用测试
    enable_testing()

# 测试程序是否成功运行
    add_test (test_run demo 5 2)

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

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