CMake简介和初步使用

CMake官方网址

CMake是一个开源、跨平台的工具系列,用于构建、测试和打包软件。CMake利用简单的平台和独立于编译器的配置文件来进行控制软件编译过程,并生成可在当前编译器环境中使用的makefile和工作区。这套CMake工具是由Kitware创建的,以响应对ITK和VTK等开源项目的强大的跨平台构建环境的需求。

一个简单的例子(Step 1)

一个最简单的例子是从源代码文件中构建一个可执行文件。对于一个简单的项目,只需要一个三行的CMakeLists.txt文件。在Step1目录中创建一个CMakeLists.txt文件,如下所示:

cmake_minimum_required(VERSION 3.10)

# set the project name
project(Tutorial)

# add the executable
add_executable(Tutorial tutorial.cxx)

添加版本号和配置头文件

通过project()命令来设置项目名和版本号

cmake_minimum_required(VERSION 3.10)

# set the project name and version
project(Tutorial VERSION 1.0)

通过以下方式进行配置头文件

configure_file(TutorialConfig.h.in TutorialConfig.h)

因为头文件会被写入二叉树, 我们需要将头文件包含到头文件搜索列表中. 在 CMakeLists.txt 末尾加入以下代码:

target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           )

在源码目录中创建 TutorialConfig.h.in 文件并编辑输入以下内容:

// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

当CMake配置了该头文件, @Tutorial_VERSION_MAJOR@@Tutorial_VERSION_MINOR@ 的值会被替换。

tutorial.cxx 中包含头文件 TutorialConfig.h.

tutorial.cxx中输出版本号信息:

if (argc < 2) {
    // report version
    std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
              << Tutorial_VERSION_MINOR << std::endl;
    std::cout << "Usage: " << argv[0] << " number" << std::endl;
    return 1;
  }

指定C++标准

利用C++11的特性,在 tutorial.cxx中用std::stod替换atof 。同时, 移除 #include

const double inputValue = std::stod(argv[1]);

添加C++11的特性,需要在cmake代码中用正确的变量来进行声明. 最简单的方法是通过 CMAKE_CXX_STANDARD 变量。 在本例中, 在CMakeLists.txt 中设置 CMAKE_CXX_STANDARD变量值为11并且 CMAKE_CXX_STANDARD_REQUIRED 的值为True:

cmake_minimum_required(VERSION 3.10)

# set the project name and version
project(Tutorial VERSION 1.0)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

编译和测试

运行 cmake可执行文件或者用cmake-gui 配置项目,然后利用编译工具进行编译。

例如,直接使用cmake进行编译。可以在 Step1 的同级目录下执行以下命令:

mkdir Step1_build
cd Step1_build
cmake ../Step1
cmake --build .

在项目编译后Step1_build目录下执行以下语句,可以看到相应的输出:

./Tutorial 4294967296
./Tutorial 10
./Tutorial

完整代码如下

  • CMakeLists.txt

    cmake_minimum_required(VERSION 3.10)
    
    # set the project name
    project(Tutorial  VERSION 1.0)
    
    # specify the C++ standard
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED True)
    
    #config the header file
    configure_file(TutorialConfig.h.in TutorialConfig.h)
    
    # add the executable
    add_executable(Tutorial tutorial.cxx)
    
    #include the header file
    target_include_directories(Tutorial PUBLIC
                               "${PROJECT_BINARY_DIR}"
                               )
    
  • tutorial.cxx

    #include 
    #include "TutorialConfig.h"
    
    using namespace std;
    
    int main(int argc, const char * argv[]){
    	if (argc < 2) {
        	// report version
        	cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
                  << Tutorial_VERSION_MINOR << endl;
        	cout << "Usage: " << argv[0] << " number" << endl;
        	return 1;
      	}
    	const double inputValue = stod(argv[1]);
    	cout<<"inputValue = "<
  • TutorialConfig.h.in

    // the configured options and settings for Tutorial
    #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
    #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
    

你可能感兴趣的:(源码编译)