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

不同Make工具,如GNU Make、QT的qmake、微软的MS nmake、BSD Make(pmake)等,遵循着不同的规范和标准,所执行的Makefile格式也不同。如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用Make工具,必须为不同的Make工具编写不同的Makefile。
CMake是一个比Make工具更高级的编译配置工具,是一个跨平台的、开源的构建系统(BuildSystem)。CMake允许开发者编写一种平台无关的CMakeList.txt文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件,如:为Unix平台生成Makefile文件(使用GCC编译),为Windows MSVC生成projects/workspaces(使用VS IDE编译)或Makefile文件(使用nmake编译)。使用CMake作为项目架构系统的知名开源项目有VTK、ITK、KDE、OpenCV、OSG等。

二、CMake管理工程

在Linux平台下使用CMake生成Makefile并编译的流程如下:
A、编写CMake配置文件CMakeLists.txt
B、执行命令cmake PATH生成Makefile,PATH是CMakeLists.txt所在的目录。
C、使用make命令进行编译。

三、单个源文件工程 1、源文件编写

假设项目test中只有一个main.cpp源文件,程序用途是计算一个数的指数幂。

#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、编写CMakeLists.txt

在main.cpp源文件目录test下编写CMakeLists.txt文件。

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

CMakeLists.txt由命令、注释和空格组成,其中命令是不区分大小写。符号#后的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。
本例中CMakeLists.txt文件的命令如下:
cmake_minimum_required:指定运行本配置文件所需的CMake的最低版本;
project:参数值是demo,表示项目的名称是demo。
add_executable:将名为main.cpp的源文件编译成一个名称为demo的可执行文件。

3、编译工程

在源码根目录下创建一个build目录,进入build目录,执行cmake ..,生成Makefile,再使用make命令编译得到demo可执行文件。
通常,建议在源码根目录下创建一个独立的build构建编译目录,将构建过程产生的临时文件等文件与源码隔离,避免源码被污染。

四、单目录多源文件工程 1、源文件编写

假如把power函数单独写进一个名为MathFunctions.cpp的源文件里,使得这个工程变成如下的形式:

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


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

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

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