文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

2.cmake添加库

2023-08-21 13:30

关注

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_buildcd Step2_buildcmake ../Step2cmake --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)]

2. 让库可选

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

首先,在顶层CMakeLists.txt中用option()创建一个变量USE_MYMATH 。在同一个文件中,使用这个选项来决定是否构建并使用MathFunctions库。

cd ../Step2_buildcmake --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

来源地址:https://blog.csdn.net/qq_51470638/article/details/128692926

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯