1. 程式人生 > >cmake 第二步:新增庫(翻譯)

cmake 第二步:新增庫(翻譯)

新增庫

現在我們將為我們的專案中新增一個庫。這個庫將包含我們自己的實現,用於計算數字平方根。然後,可執行檔案可使用此庫而不是編譯器提供的標準平方根函式。在本教程中,我們將把庫放入一個名為MathFunctions的子目錄。它將包含以下一行CMakeLists.txt檔案:

add_library(MathFunctions mysqrt.cxx)

原始檔mysqrt.cxx有一個名為mysqrt的函式,它提供與編譯器的sqrt函式類似的功能。為了使用新庫,我們在頂級CMakeLists.txt檔案中添加了一個add_subdirectory呼叫,以便構件庫。我們還添加了另一個include目錄,以便可以為函式原型找到MathFunctions/MathFunctions.h標頭檔案。最後一個更改是將新庫新增到可執行檔案中。頂級CMakeLists.txt檔案的最後幾行現在看起來像:

include_directories("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory(MathFunctions)

# add the executable 
add_executable(Tutorial tutorial.cxx)
target_link_libraries(Tutorial MathFunctions)

現在讓我們考慮一下如何使MathFunctions庫成為可選項。在本教程中沒有任何理由這樣做,但是使用大型庫或依賴於第三方庫程式碼時您可能會有這個想法。第一步是在頂級CMakeLists.txt檔案中新增一個選項。

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

這將顯示在CMake GUI中,預設值為ON,使用者可以根據需要更改。此設定將儲存在快取中,這樣使用者在此專案上執行CMake時都不需要繼續設定它。下一個更改是使MathFunctions庫的構建和連結成為條件。為此,我們將頂級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設定來確定是否編譯和使用MathFunctions。請注意,使用變數(在本例中為EXTRA_LIBS)來收集任何可選的庫,以便以後連結到可執行檔案中。這是用於保持具有許多可選元件的大專案元件簡潔的常用方法。原始碼的相應更改非常簡單,我們可以看一下

// 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;
}

在原始碼中我們也使用了USE_MYMATH。這是通過CMake使用TutorialConfig.h.in配置檔案提供給原始碼,TutorialConfig.h.in配置檔案新增如下程式碼:

#cmakedefine USE_MYMATH