【cmake系列使用教程】linux
cmake使用教程(二)-添加庫github
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;
}
複製代碼
咱們編譯執行看如下結果
~/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
複製代碼
~/Desktop/Tutorial/Step2/ ./Tutorial 4
The square root of 4 is 2
複製代碼
能夠看到,這個開關達到了咱們須要的效果。