linuxcmakegui使⽤教程,cmake使⽤教程(⼆)-添加库【cmake系列使⽤教程】
这个系列的⽂章翻译⾃官⽅cmake教程:cmake tutorial。
不会仅仅停留在官⽅教程。本⼈作为⼀个安卓开发者,实在是没有linux c程序开发经验,望⼤佬们海涵。教程是在macos下完成,⼤部分linux我也测试过,有特殊说明的我会标注出来。本教程基于cmake-3.10.2,同时认为你已经安装好cmake。
构建⾃⼰的库
这个库将包含我们⾃⼰计算⼀个数字的平⽅根的计算⽅法。⽣成的程序可以使⽤这个库,⽽不是由编译器提供的标准平⽅根函数(math.h)。
在本教程中,我们将把库放到⼀个名为mathfunction的⼦⽬录中,在⼯程⽬录下新建mathfunction⽂件夹。这个⽂件夹中新建⽂件,包含以下⼀⾏代码:
add_library()
复制代码
然后在这个⽂件夹中创建源⽂件,它只有⼀个名为mysqrt的函数,与编译器的sqrt函数提供了类似的功能。
为了利⽤新库,我们在⼯程根⽬录下的中添加add_subdirectory()来构建我们⾃⼰的库。我们还添加了另⼀个include⽬录,以便MathFunctions / MathFunctions.h可以为函数原型到头⽂件,该⽂件代码如下:
double mysqrt(double x);
复制代码
然后创建⽂件,内容如下
#include "MathFunctions.h"
#include
// 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
cmake如何使用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;
}
复制代码
最后⼀个更改是将新库添加到可执⾏⽂件。根⽬录下的最后添加以下代码
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
# add the executable
add_executable ()
target_link_libraries (Tutorial MathFunctions)
复制代码
现在⽂件⽬录如下
.
├──
├── MathFunctions
│ ├──
│ ├── MathFunctions.h
│ └──
├── TutorialConfig.h.in
└──
复制代码
构建可选选项
MathFunctions是我们⾃⼰构建的库,有时候我们需要控制这个库是否应该使⽤,那么可以为使⽤这个库添加⼀个开关,在构建⼤型项⽬时⾮常有⽤。
在项⽬根⽬录下的⽂件中添加如下代码:
# should we use our own math functions?
option (USE_MYMATH
"Use tutorial provided math implementation" ON)
复制代码
假如你使⽤的是CMake GUI,USE_MYMATH默认值是⽤户可以根据需要更改。该设置将存储在缓存中,以便⽤户在每次运⾏CMake时⽣成默认配置。然后我们就可以选择性的构建和使⽤mathfunction库。修改根⽬录下:
# add the MathFunctions library?
#
include_directories ("${PROJECT_SOURCE_DIR}/MathFunctions")
add_subdirectory (MathFunctions)
set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)
endif (USE_MYMATH)
# add the executable
add_executable ()
target_link_libraries (Tutorial ${EXTRA_LIBS})
复制代码
这将使⽤USE_MYMATH的设置来确定是否应该编译和使⽤mathfunction库。注意,使⽤⼀个变量(在本例中是EXTRA_LIBS)来设置可选的库,然后将它们链接到可执⾏⽂件中。这是⼀种常见的⽅法,⽤于保持较⼤的项⽬具有许多可选组件。
⾸先在Configure.h.in⽂件中添加以下内容:
#cmakedefine USE_MYMATH
复制代码
然后我们就可以使⽤USE_MYMATH这个变量了,最后修改源代码如下:
// A simple program that computes the square root of a number
#include
#include
#include
#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]);
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=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
复制代码不适⽤⾃定义的库(USE_MYMATH=OFF) ~/Desktop/Tutorial/Step2/ ./Tutorial 4
The square root of 4 is 2
复制代码
可以看到,这个开关达到了我们需要的效果。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论