ubuntu下cmake学习

这个系列的博客是是从cmake 官方学来的,相当于是他的中文版吧,原版请看https://cmake.org/cmake-tutorial/

官方教程有7步,我打算只讲(fanyi)前2步,后面的基本都类似,看官方教程即可。

Step 1:新建一个可执行程序

首先确保你已经安装了cmake 和 g++,如果没有安装,就:

sudo apt-get install cmake g++

然后准备一个工作空间,并准备一些素材:

mkdir learn_cmake_again
cd learn_cmake_again
touch CMakeLists.txt
touch tutoria.cpp

然后给文件加内容:

#CMakeLists.txt文件内容
#版本号
cmake_minimum_required (VERSION 2.8)
#项目名
project (Tutorial)
#生成可执行程序 语法:add_executable(可执行程序名  要编译的cpp)
add_executable(Tutorial tutorial.cpp)
//cpp文件中的内容
// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main (int argc, char *argv[])
{
  if (argc < 2)
    {
    fprintf(stdout,"Usage: %s number\n",argv[0]);
    return 1;
    }
  double inputValue = atof(argv[1]);
  double outputValue = sqrt(inputValue);
  fprintf(stdout,"The square root of %g is %g\n",
          inputValue, outputValue);
  return 0;
}

现在就可以尝试链接编译成可执行程序了

cmake .
make 
./Tutorial 16

结果很明显是对的,哈哈,接下来一个任务就要往程序里面增加一点变量


 

CMakeLists.txt中的内容为:

cmake_minimum_required (VERSION 2.6)
project (Tutorial)
# The version number.
# 将版本号设置为变量,它具体的作用会在第六步讲到 set (Tutorial_VERSION_MAJOR
1) set (Tutorial_VERSION_MINOR 0) # configure a header file to pass some of the CMake settings # to the source code #.h.in文件是可以自动编译的文件,通过下面这个命令可以得到.h文件
# 关于PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR的区别可以查看:http://blog.csdn.net/sukhoi27smk/article/details/46388711,本教程中就不做区分了 configure_file (
"${PROJECT_SOURCE_DIR}/TutorialConfig.h.in" "${PROJECT_BINARY_DIR}/TutorialConfig.h" ) # add the binary tree to the search path for include files # so that we will find TutorialConfig.h include_directories("${PROJECT_BINARY_DIR}") # add the executable add_executable(Tutorial tutorial.cpp)
//cpp文件里的内容
// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "TutorialConfig.h"
 
int main (int argc, char *argv[])
{
  if (argc < 2)
    {
    fprintf(stdout,"%s Version %d.%d\n",
            argv[0],
            Tutorial_VERSION_MAJOR,
            Tutorial_VERSION_MINOR);
    fprintf(stdout,"Usage: %s number\n",argv[0]);
    return 1;
    }
  double inputValue = atof(argv[1]);
  double outputValue = sqrt(inputValue);
  fprintf(stdout,"The square root of %g is %g\n",
          inputValue, outputValue);
  return 0;
}
//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 .
make

就会看到自动生成了TutorialConfig.h文件,而且此时cpp里还可以打印出CMakeLists.txt里定义的变量,纵观来看,.in文件相当于是一个桥梁,架起了cmakelists中的变量到cpp的传递。

平时看项目时的CMakeLists.txt可没那么简单,经常会包含新建库,然后链接库的步骤。


 

Step 2:添加一个库

此时我们需要改一下文件结构了,如图

子目录

以下是各个文件的内容:

#外部的CMakeLists.txt
cmake_minimum_required (VERSION 2.8)
project (Tutorial)
# The version number.
set (Tutorial_VERSION_MAJOR 1)
set (Tutorial_VERSION_MINOR 0)
 
# configure a header file to pass some of the CMake settings
# to the source code
configure_file (
  "${PROJECT_SOURCE_DIR}/TutorialConfig.h.in"
  "${PROJECT_BINARY_DIR}/TutorialConfig.h"
  )
# should we use our own math functions?
# 相当于是个flag option (USE_MYMATH "Use tutorial provided math implementation" ON) # add the binary tree to the search path for include files # so that we will find TutorialConfig.h # add the MathFunctions library? # if (USE_MYMATH) include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions") add_subdirectory (MathFunctions) #将MathFunctions中的子目录也包含进去 set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions) # set语法: set(<变量> <值> <值>),把值赋给变量,多个值的话,就把多个值拼接赋给变量 endif (USE_MYMATH) # add the executable add_executable (Tutorial tutorial.cpp) target_link_libraries (Tutorial ${EXTRA_LIBS})
//tutorial.cpp的内容
// A simple program that computes the square root of a number
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "TutorialConfig.h"
#ifdef USE_MYMATH
#include "MathFunctions.h"
#endif
 
int main (int argc, char *argv[])
{
  if (argc < 2)
    {
    fprintf(stdout,"%s Version %d.%d\n", argv[0],
            Tutorial_VERSION_MAJOR,
            Tutorial_VERSION_MINOR);
    fprintf(stdout,"Usage: %s number\n",argv[0]);
    return 1;
    }
 
  double inputValue = atof(argv[1]);
//根据外部的情况,选择用哪一部分程序,在实际项目中经常用到,比如有多个版本的opencv时,就可以由多个选择,提高兼容性 #ifdef USE_MYMATH
double outputValue = mysqrt(inputValue); #else double outputValue = sqrt(inputValue); #endif fprintf(stdout,"The square root of %g is %g\n", inputValue, outputValue); return 0; }
//TutorialConfig.h.in文件内容,.h文件不用写会自动生成
// the configured options and settings for Tutorial
//它的作用主要是用于生成.h文件,所以具体看.h文件体会其作用即可 #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@ #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@ #cmakedefine USE_MYMATH
#子文件夹中的CMakeLists.txt
add_library(MathFunctions mysqrt.cpp)
//MathFunctions.h内容
#include<iostream>
#include<math.h>
double mysqrt(double a) ;
//mysqrt.cpp内容
#include<iostream>
#include<math.h>
#include<MathFunctions.h>
using namespace std;

double mysqrt(double a) {
cout<<"its my sqrt"<<endl;
return sqrt(a);
}

之后cmake . 和make,就可以了

  

posted @ 2017-11-18 18:41  实事求是>_<  阅读(4966)  评论(0编辑  收藏  举报