Exercise6

本文展示了一个CMake驱动的项目示例,该项目包括一个主程序和一个自定义的数学函数库。CMakeLists.txt文件用于配置项目,定义版本号,选择性地使用自定义数学实现,并在构建过程中生成和使用配置头文件。通过CMake构建系统,可以编译和链接可执行文件,该文件能够计算平方根,并在启用USE_MYMATH选项时使用自定义的mysqrt函数。
摘要由CSDN通过智能技术生成

Configure.h.in file

ubuntu@ubuntu:$ vim TutorialConfig.h.in 
ubuntu@ubuntu:$ cat TutorialConfig.h.in 
// the configured options and settings for Tutorial
// TODO : Define Tutorial_VERSION_MAJOR and Tutorial_VERSION_MINOR

#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

#cmakedefine USE_MYMATH
ubuntu@ubuntu:$ 

Cxx file

ubuntu@ubuntu:$ vim tutorial.cxx 
ubuntu@ubuntu:$ cat tutorial.cxx 
// A simple program that computes the square root of a number
#include <cmath>
#include <iostream>
#include <string>

#include "TutorialConfig.h"
#ifdef USE_MYMATH
#include "MathFunctions.h"
#endif


int main(int argc, char* argv[])
{
  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;
  }

  // convert input to double
  // std::stod是C++ 11标准函数
  const double inputValue = std::stod(argv[1]);

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

Top CMake file

ubuntu@ubuntu:$ vim CMakeLists.txt 
ubuntu@ubuntu:$ cat CMakeLists.txt 

# TODO : Set the minimum required version of CMake to be 3.10

cmake_minimum_required(VERSION 3.10)

# TODO : Create a project named Tutorial and project version number 1.0

project(Tutorial VERSION 1.0)

# TODO : Set the variable CMAKE_CXX_STANDARD to 11

#    and the variable CMAKE_CXX_REQUIRED_STANDARD to True

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# TODO : Create a variable MY_MATH using option and set default to ON

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


# TODO : Use configure_file to configure and copy TutorialConfig.h.in to

#         TutorialConfig.h

configure_file(TutorialConfig.h.in TutorialConfig.h)


# TODO : Use list() and APPEND to create a list of optional libraries

# called  EXTRA_LIBS and a list of optional include directories called

# EXTRA_INCLUDES. Add the MathFunctions library and source directory to

# the appropriate lists.

#

# Only call add_subdirectory and only add MathFunctions specific values

# to EXTRA_LIBS and EXTRA_INCLUDES if USE_MYMATH is true.

if(USE_MYMATH)
    add_subdirectory(MathFunctions)
    list(APPEND EXTRA_LIBS MathFunctions)
endif()



# TODO : Add an executable called Tutorial to the project

# Hint: Be sure to specify the source file as tutorial.cxx

add_executable(Tutorial tutorial.cxx)

# TODO : Use target_link_libraries to link the library to our executable

target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})

# TODO : Use target_include_directories to include ${PROJECT_BINARY_DIR}

target_include_directories(Tutorial PUBLIC
                           ${PROJECT_BINARY_DIR}
                          )


ubuntu@ubuntu:$ 

MathFunctions directory

ubuntu@ubuntu:$ ls -tlr
total 12
-rw-r--r-- 1 ubuntu ubuntu 456 Oct 12 22:26 mysqrt.cxx
-rw-r--r-- 1 ubuntu ubuntu 128 Oct 18 09:59 CMakeLists.txt
-rw-r--r-- 1 ubuntu ubuntu  94 Oct 18 10:01 MathFunctions.h
ubuntu@ubuntu:$ 

MathFunctions Cxx file

ubuntu@ubuntu:$ vim mysqrt.cxx 
ubuntu@ubuntu:$ cat mysqrt.cxx 
#include <iostream>

// a hack square root calculation using simple operations
double mysqrt(double x)
{
  if (x <= 0) {
    return 0;
  }

  double result = x;

  // do ten iterations
  for (int i = 0; i < 10; ++i) {
    if (result <= 0) {
      result = 0.1;
    }
    double delta = x - (result * result);
    result = result + 0.5 * delta / result;
    std::cout << "Computing sqrt of " << x << " to be " << result << std::endl;
  }
  return result;
}
ubuntu@ubuntu:$

MathFunction header file

ubuntu@ubuntu:$ vim MathFunctions.h 
ubuntu@ubuntu:$ cat MathFunctions.h 
#ifndef __MATHFUNCTION___H__H
#define __MATHFUNCTION___H__H

double mysqrt(double x);

#endif
ubuntu@ubuntu:$

MathFunctions CMake file

ubuntu@ubuntu:$ vim CMakeLists.txt 
ubuntu@ubuntu:$ cat CMakeLists.txt 
# TODO : Add a library called MathFunctions

# Hint: You will need the add_library command
add_library(MathFunctions mysqrt.cxx)

# TODO : State that anybody linking to MathFunctions needs to include the

# current source directory, while MathFunctions itself doesn't.

# Hint: Use target_include_directories with the INTERFACE keyword

target_include_directories(MathFunctions
                  INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
                          )
ubuntu@ubuntu:$

构建cmake工程

ubuntu@ubuntu:$ ls -tlr
total 16
-rw-r--r-- 1 ubuntu ubuntu  904 Oct 12 22:26 tutorial.cxx
-rw-r--r-- 1 ubuntu ubuntu  188 Oct 12 22:26 TutorialConfig.h.in
-rw-r--r-- 1 ubuntu ubuntu  983 Oct 18 15:52 CMakeLists.txt
drwxr-xr-x 2 ubuntu ubuntu 4096 Oct 18 15:54 MathFunctions
ubuntu@ubuntu:$ mkdir exercise7_build
ubuntu@ubuntu:$ ls -tlr
total 20
-rw-r--r-- 1 ubuntu ubuntu  904 Oct 12 22:26 tutorial.cxx
-rw-r--r-- 1 ubuntu ubuntu  188 Oct 12 22:26 TutorialConfig.h.in
-rw-r--r-- 1 ubuntu ubuntu  983 Oct 18 15:52 CMakeLists.txt
drwxr-xr-x 2 ubuntu ubuntu 4096 Oct 18 15:54 MathFunctions
drwxrwxr-x 2 ubuntu ubuntu 4096 Oct 18 15:59 exercise7_build
ubuntu@ubuntu:$ cd exercise7_build/
ubuntu@ubuntu:$ cmake ..
-- Build files have been written to: /home/ubuntu/study/cmake-learning/cmake-3.25.0-rc1-tutorial-source/Step3/exercise7_build
ubuntu@ubuntu:$ cmake --build .
ubuntu@ubuntu:$
ubuntu@ubuntu:$ ls -tlr
total 56
-rw-r--r-- 1 ubuntu ubuntu   137 Oct 18 15:59 TutorialConfig.h
-rw-rw-r-- 1 ubuntu ubuntu 14733 Oct 18 15:59 CMakeCache.txt
-rw-rw-r-- 1 ubuntu ubuntu  6061 Oct 18 15:59 Makefile
-rw-rw-r-- 1 ubuntu ubuntu  1963 Oct 18 15:59 cmake_install.cmake
drwxrwxr-x 3 ubuntu ubuntu  4096 Oct 18 15:59 MathFunctions
-rwxrwxr-x 1 ubuntu ubuntu 15008 Oct 18 15:59 Tutorial
drwxrwxr-x 6 ubuntu ubuntu  4096 Oct 18 15:59 CMakeFiles
ubuntu@ubuntu:$ cat TutorialConfig.h 
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR 1
#define Tutorial_VERSION_MINOR 0
#define USE_MYMATH
ubuntu@ubuntu:$ 

运行可执行文件

ubuntu@ubuntu:$ ./Tutorial 4294967296
Computing sqrt of 4.29497e+09 to be 2.14748e+09
Computing sqrt of 4.29497e+09 to be 1.07374e+09
Computing sqrt of 4.29497e+09 to be 5.36871e+08
Computing sqrt of 4.29497e+09 to be 2.68435e+08
Computing sqrt of 4.29497e+09 to be 1.34218e+08
Computing sqrt of 4.29497e+09 to be 6.71089e+07
Computing sqrt of 4.29497e+09 to be 3.35545e+07
Computing sqrt of 4.29497e+09 to be 1.67773e+07
Computing sqrt of 4.29497e+09 to be 8.38878e+06
Computing sqrt of 4.29497e+09 to be 4.19465e+06
The square root of 4.29497e+09 is 4.19465e+06
ubuntu@ubuntu:$ ./Tutorial 10
Computing sqrt of 10 to be 5.5
Computing sqrt of 10 to be 3.65909
Computing sqrt of 10 to be 3.19601
Computing sqrt of 10 to be 3.16246
Computing sqrt of 10 to be 3.16228
Computing sqrt of 10 to be 3.16228
Computing sqrt of 10 to be 3.16228
Computing sqrt of 10 to be 3.16228
Computing sqrt of 10 to be 3.16228
Computing sqrt of 10 to be 3.16228
The square root of 10 is 3.16228
ubuntu@ubuntu:$ ./Tutorial 
./Tutorial Version 1.0
Usage: ./Tutorial number
ubuntu@ubuntu:$ 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值