cmake使用教程(二)-添加庫

【cmake系列使用教程】linux

cmake使用教程(一)-起步git

cmake使用教程(二)-添加庫github

cmake使用教程(三)-安裝、測試、系統自檢macos

cmake使用教程(四)-文件生成器緩存

cmake使用教程(五)-cpack生成安裝包bash

cmake使用教程(六)-蛋疼的語法ide

cmake使用教程(七)-流程和循環函數

cmake使用教程(八)-macro和functionpost

這個系列的文章翻譯自官方cmake教程:cmake tutorial測試

示例程序地址:github.com/rangaofei/t…

不會僅僅停留在官方教程。本人做爲一個安卓開發者,實在是沒有linux c程序開發經驗,望大佬們海涵。教程是在macos下完成,大部分linux我也測試過,有特殊說明的我會標註出來。本教程基於cmake-3.10.2,同時認爲你已經安裝好cmake。

構建本身的庫

這個庫將包含咱們本身計算一個數字的平方根的計算方法。生成的程序可使用這個庫,而不是由編譯器提供的標準平方根函數(math.h)。

在本教程中,咱們將把庫放到一個名爲mathfunction的子目錄中,在工程目錄下新建mathfunction文件夾。這個文件夾中新建CMakeLists.txt文件,包含如下一行代碼:

add_library(MathFunctions mysqrt.cxx)
複製代碼

而後在這個文件夾中建立源文件mysqrt.cxx,它只有一個名爲mysqrt的函數,與編譯器的sqrt函數提供了相似的功能。

爲了利用新庫,咱們在工程根目錄下的CMakeLists.txt中添加add_subdirectory()來構建咱們本身的庫。咱們還添加了另外一個include目錄,以便MathFunctions / MathFunctions.h能夠爲函數原型找到頭文件,該文件代碼以下:

double mysqrt(double x);
複製代碼

而後建立mysqrt.cxx文件,內容以下

#include "MathFunctions.h"
#include <stdio.h>

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

  double result;
  double delta;
  result = x;

  // do ten iterations
  int i;
  for (i = 0; i < 10; ++i) {
    if (result <= 0) {
      result = 0.1;
    }
    delta = x - (result * result);
    result = result + 0.5 * delta / result;
    fprintf(stdout, "Computing sqrt of %g to be %g\n", x, result);
  }
  return result;
}
複製代碼

最後一個更改是將新庫添加到可執行文件。根目錄下CMakeLists.txt的最後添加如下代碼

include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions) 
 
# add the executable
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial MathFunctions)
複製代碼

如今文件目錄以下

.
├── CMakeLists.txt
├── MathFunctions
│   ├── CMakeLists.txt
│   ├── MathFunctions.h
│   └── mysqrt.cxx
├── TutorialConfig.h.in
└── tutorial.cxx
複製代碼

構建可選選項

MathFunctions是咱們本身構建的庫,有時候咱們須要控制這個庫是否應該使用,那麼能夠爲使用這個庫添加一個開關,在構建大型項目時很是有用。

在項目根目錄下的CMakeLists.txt文件中添加以下代碼:

# should we use our own math functions?
option (USE_MYMATH 
        "Use tutorial provided math implementation" ON)
複製代碼

假如你使用的是CMake GUI,USE_MYMATH默認值是用戶能夠根據須要更改。該設置將存儲在緩存中,以便用戶在每次運行CMake時生成默認配置。而後咱們就能夠選擇性的構建和使用mathfunction庫。修改根目錄下CMakeLists.txt:

# add the MathFunctions library?
#
if (USE_MYMATH)
  include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
  add_subdirectory (MathFunctions)
  set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
 
# add the executable
add_executable (Tutorial tutorial.cxx)
target_link_libraries (Tutorial  ${EXTRA_LIBS})
複製代碼

這將使用USE_MYMATH的設置來肯定是否應該編譯和使用mathfunction庫。注意,使用一個變量(在本例中是EXTRA_LIBS)來設置可選的庫,而後將它們連接到可執行文件中。這是一種常見的方法,用於保持較大的項目具備許多可選組件。 首先在Configure.h.in文件中添加如下內容:

#cmakedefine USE_MYMATH
複製代碼

而後咱們就可使用USE_MYMATH這個變量了,最後修改Tutorial.cxx源代碼以下:

// 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]);
 
#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;
}
複製代碼

咱們編譯執行看如下結果

  1. 使用自定義的庫(USE_MYMATH=ON)
 ~/Desktop/Tutorial/Step2/ ./Tutorial 4
Computing sqrt of 4 to be 2.5
Computing sqrt of 4 to be 2.05
Computing sqrt of 4 to be 2.00061
Computing sqrt of 4 to be 2
Computing sqrt of 4 to be 2
Computing sqrt of 4 to be 2
Computing sqrt of 4 to be 2
Computing sqrt of 4 to be 2
Computing sqrt of 4 to be 2
Computing sqrt of 4 to be 2
The square root of 4 is 2
複製代碼
  1. 不適用自定義的庫(USE_MYMATH=OFF)
 ~/Desktop/Tutorial/Step2/ ./Tutorial 4
The square root of 4 is 2
複製代碼

能夠看到,這個開關達到了咱們須要的效果。

相關文章
相關標籤/搜索