0


2.cmake添加库

  • add_library()
  • add_subdirectory()
  • target_include_directories()
  • target_link_libraries()
  • PROJECT_SOURCE_DIR

1. 创建库

要在cmake中添加库,请使用

add_library()

并指定由哪些源文件组成库。

我们可以使用一个或多个子目录来组织项目,而不是将所有源文件放在一个目录中。在这种情况下,我们将专门为库创建一个子目录。

在这里,我们可以添加一个新的

CMakeLists.txt

文件和一个或多个源文件。在顶级

CMakeLists.txt

文件中,我们将使用

add_subdirectory()

将子目录添加到构建中。

一旦创建了库,它就通过

target_include_directory()

target_link_library()

连接到我们的可执行目标。

这里,我们将向项目中添加一个库,其中包含我们自己的实现,用于计算数字的平方根。然后,可执行文件可以使用这个库,而不是编译器提供的标准平方根函数。

我们将这个库放在一个名为

Mathfunction

的子目录中。这个目录以及包含一个头文件

MathFunctions.h

和一个源文件

mysqrt.cxx

。我们不需要修改这两个文件中的任何一个。源文件。源文件有一个名为

mysqrt

的函数,它提供与编译器的

sqrt

函数类似的功能。

Help/guide/tutorial/Step2

中完成TODO 1~6;
首先是

MathFunctions

子目录中的单行

CMakeLists.txt


下来,是顶层

CMakeLists.txt


最后,使用新创建的库。

mkdir Step2_build
cd Step2_build
cmake ../Step2
cmake --build.
  1. TODO 1Mathfunction目录中的CMakeLists.txt文件中,我们使用add_library()创建一个名为Mathfunction的库目标。库的源文件作为参数传递给add_library()add_library(MathFunctions mysqrt.cxx)
  2. TODO 2 为了使用这个新库,在顶级CMakeLists.txt中添加add_subdirectory()调用,以便构建这个库。add_subdirectory(MathFunctions)
  3. TODO 3 下来,使用target_link_library()将新的库目标链接到可执行目标。target_link_libraries(Tutorial PUBLIC MathFunctions)
  4. TODO 4 最后,需要指定库的头文件的位置。修改target_include_directory(),将MathFunctions.h子目录添加为include目录,以便可找到MathFunctions.h文件。target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}""${PROJECT_SOURCE_DIR}/MathFunctions")
  5. TODO 5 使用库函数#include"MathFunctions.h"constdouble outoutValue =mysqrt(inputValue);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2QMLt3VB-1673753439626)(vx_images/334435414616010.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XheElqxX-1673753439631)(vx_images/107916137941761.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ewKEBGM9-1673753439633)(vx_images/435676301890165.png)]

  • 如果不在target_include_direcotry()中添加lib,会找不到头文件func.h
  • 如果没有add_subdirectory(lib),不会构建子目录,会导致找不到链接库。

2. 让库可选

cmake可以使用

option()

命令,这为用户提供了一个变量,他们可以在配置cmake构建时更改该变量,此设置将存储在缓存中,因此用户无需每次在构建目录上运行cmake时都设置该值。

首先,在顶层CMakeLists.txt中用

option()

创建一个变量

USE_MYMATH

。在同一个文件中,使用这个选项来决定是否构建并使用

MathFunctions

库。

cd../Step2_build
cmake --build.

现在让我们更新USE_MYMATHto的值为OFF,

cmake ../Step2 -DUSE_MYMATH=OFF

然后构建

cmake --build.

解决方案

第一步是向顶层CMakeLists.txt文件添加一个选项。

option(USE_MYMATH "Use tutorial provided math implementation" ON)

接下来,使构建和链接MathFunctions库成为可选的,把他们添加到列表中。

if(USE_MYMATH)
    add_subdirectory(MathFunctions)
    list(APPEND EXTRA_LIBS MathFunctions)
    list(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/MathFunctions")
endif()

现在,有了两个列表,我嫩需要更新

target_link_libraries()

target_include_directories()

来使用它们.
对于

target_link_libraries()

, 我们将写出的库名称替换为EXTRA_LIBS. 这看起来像下面这样:

target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})
target_include_directories(Tutorial PUBLIC
                            "${PROJECT_BINARY_DIR}"${EXTRA_INCLUDES})

这是处理许多组件时的经典方法。我们将在本教程的第 3 步中介绍现代方法。

对源代码的相应更改非常简单。首先,在 中tutorial.cxx,我们包含MathFunctions.h标头

if USE_MYMATH

tutorial.cxx

#ifdefUSE_MYMATH#include"MathFunctions.h"#endif

然后,在同一个文件中,我们使用

USE_MYMATH

来控制使用哪个平方根函数:

#ifdefUSE_MYMATHconstdouble outputValue =mysqrt(inputValue);#elseconstdouble outputValue =sqrt(inputValue);#endif

由于源代码现在需要USE_MYMATH我们可以将其添加到 TutorialConfig.h.in:

TutorialConfig.in:

#cmakedefineUSE_MYMATH
标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/qq_51470638/article/details/128692926
版权归原作者 barbyQAQ 所有, 如有侵权,请联系我们删除。

“2.cmake添加库”的评论:

还没有评论