cmake使用02:包含一个 头文件和一个源文件的项目

项目包含一个头文件和一个源文件

tutorial.cxx使用到TutorialConfig.h中定义的宏(Tutorial_VERSION_MAJOR , Tutorial_VERSION_MINOR)

  1. 头文件和源文件在同一目录下:
    头文件TutorialConfig.h(定义了两个宏,表示版本号:Tutorial_VERSION_MAJOR ,Tutorial_VERSION_MINOR )
#define Tutorial_VERSION_MAJOR 1
#define Tutorial_VERSION_MINOR 0

tutorial.cxx:计算开方

#include <cmath>
#include <iostream>
#include <string>

#include "TutorialConfig.h"

int main(int argc, char* argv[])
{
    if(argc!=2) return -1;
    std::cout <<  Tutorial_VERSION_MAJOR << "."
              << Tutorial_VERSION_MINOR << std::endl;
   

  // convert input to double
  const double inputValue = atof(argv[1]);

  // calculate square root
  const double outputValue = sqrt(inputValue);
  std::cout << "The square root of " << inputValue << " is " << outputValue
            << std::endl;
  return 0;
}

CMakeLists.txt:
采用add_executable()生成可执行文件,如1处所示。

cmake_minimum_required(VERSION 3.10)

project(Tutorial )

//1.
add_executable(Tutorial tutorial.cxx)

# PROJECT_BINARY_DIR为构建目录,也就是./step2/build/
# target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" )
  1. 源文件和所需的头文件不在同一目录下
    目录结构如下:
./step2/---
        |---build/
               |--TutorialConfig.h
        |---tutorial.cxx
        |---CMakeLists.txt

CMakeLists.txt:
这种情况需通过target_include_directories()指定target(此处为可执行文件Tutorial)所需头文件路径。如2.处所示
相当于:g++ tutorial.cxx -o Tutorial

cmake_minimum_required(VERSION 3.10)

project(Tutorial )


add_executable(Tutorial tutorial.cxx)

//2:
target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" )
  1. 传递cmake变量自动生成头文件TutorialConfig.h.
    在之前,TutorialConfig.h中表示版本号的宏定义是我们预先写入该头文件的。
    现在我们想要由cmake决定这些宏的值或者宏是否定义。
    目录结构如下:
./step2/---
        |---build/
               |----TutorialConfig.h
        |---tutorial.cxx
        |---CMakeLists.txt
        |----TutorialConfig.h.in

CmakeLists.tx如下:

cmake_minimum_required(VERSION 3.10)

#1. 为项目增加版本号
# 使得cmake内部变量Tutorial_VERSION_MAJOR=1,
# Tutorial_VERSION_MINOR=0
project(Tutorial VERSION 1.0)

# 2. 自定义option变量.

option(USE_MYMATH "Use tutorial provided math implementation" ON)

# 3.. 基于TutorialConfig.h.in生成 TutorialConfig.h
configure_file(TutorialConfig.h.in TutorialConfig.h)

add_executable(Tutorial tutorial.cxx)

target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}" )

TutorialConfig.h.in,在该文件中
可以获取cmake内部变量的值,如1处
根据cmake内部的option变量的取值是否为ON定义宏名,如2处。

configure_file(TutorialConfig.h.in TutorialConfig.h)负责修改TutorialConfig.h.in并生成TutorialConfig.h。

//1. 
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
//2.
#cmakedefine USE_MYMATH

构建目录./build下执行cmake ..生成Makefile之外,还生成utorialConfig.h,如下

//1. 
#define Tutorial_VERSION_MAJOR 1
#define Tutorial_VERSION_MINOR 0
//2.
#define USE_MYMATH

修改VERSION 1.0VERSION 2.1,重新cmake ..,你会发现 1处宏定义的值随之更改

执行cmake .. -DUSE_MYMATH=OFF(修改变量USE_MYMATH的值),你会发现2处将被删除(USE_MYMATH不再定义)

make 构建程序,构建结果目录如下

./step2/---
        |---build/
            |--Makefile
            |--TutorialConfig.h
        |---tutorial.cxx
        |---CMakeLists.txt
        |---TutorialConfig.h.in
posted @ 2024-06-27 23:24  旅行者2号  阅读(8)  评论(0编辑  收藏  举报