2.cmake添加库

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
  • 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 1
    Mathfunction目录中的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"
    
    const double 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 -D USE_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

#ifdef USE_MYMATH
#    include "MathFunctions.h"
#endif

然后在同一个文件中我们使用USE_MYMATH来控制使用哪个平方根函数

#ifdef USE_MYMATH
    const double outputValue = mysqrt(inputValue);
#else
    const double outputValue = sqrt(inputValue);
#endif

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

TutorialConfig.in:

#cmakedefine USE_MYMATH
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6