gpt4 book ai didi

cmake - 为什么使用 add_library({tgt} IMPORTED) 与 target_link_libraries(-l {.so | .a})?

转载 作者:行者123 更新时间:2023-12-04 13:56:44 29 4
gpt4 key购买 nike

使用语句的目的是什么:

add_library(<tgt> [SHARED|STATIC] IMPORTED)

根据我的发现,即使您在上面创建了一个导入的库目标,您仍然需要指定实际 .so 或 .a 的具体位置。这将需要至少 3 个 cmake 命令来链接到可执行文件,并且编译器仍然不会自动搜索操作系统上的公共(public)包含目录。

例子:
cmake code to link IMPORTED lib

从 CMake 文档中,我了解到实际上有 3 种方法可以链接未构建为整个应用程序/库的子项目中的目标的库。

CMake target_link_libraries() documentation
  • 将 CMake 包用于随附的包脚本之一。
  • 使用链接器标志:
    target_link_libraries(<tgt> [SHARED|STATIC|...] -lncursesw)
  • 或者使用 IMPORTED 库方法(在顶部的代码中显示)。

  • 使用第二种方法时的一个主要区别是它只需要一行代码,并且会搜索您操作系统上所有编译器的预定义包含目录。谁能帮我理解为什么使用 add_library() 方法?

    其他已发布的 SO 帖子:

    Include directories for IMPORTED libs

    CMake imported library behavior

    最佳答案

    您应该使用 add_library(<tgt> [SHARED|STATIC] IMPORTED)每当您需要为 <tgt> 设置属性,例如依赖关系、编译定义、编译标志等时和/或扩展,链接到 <tgt> 的任何目标.

    假设您有两个静态库; libfoobar.alibraboof.a , 其中 libfoobar.a需要 libraboof.a .假设这些库包含一些由 -DSOME_FEATURE 启用的功能。 .

    add_library(raboof STATIC IMPORTED)
    set_target_properties(raboof PROPERTIES
    IMPORTED_LOCATION <path-to-libraboof.a>
    INTERFACE_COMPILE_DEFINITIONS "SOME_FEATURE"
    )

    add_library(foobar STATIC IMPORTED)
    set_target_properties(foobar PROPERTIES
    IMPORTED_LOCATION <path-to-libfoobar.a>
    INTERFACE_LINK_LIBRARIES raboof
    )

    所以当你链接到 libfoobar.a :
    add_executable(my_app main.cpp)
    target_link_libraries(my_app foobar)
    CMake将确保以正确的顺序链接所有依赖项,并且在这种情况下还将附加 -DSOME_FEATURE编译时的编译标志 my_app .请注意,由于我们添加了 libraboof.a作为对 libfoobar.a 的依赖项, -DSOME_FEATURE被添加到链接到 libfoobar.a 的任何目标中通过传递属性。

    如果你不使用 add_library(<tgt> <SHARED|STATIC> IMPORTED)在这种情况下,您必须自己为每个目标管理任何依赖项和所需的构建选项,这很容易出错。
    Config中也经常使用这种方法-用于多组件库的模块,用于管理组件之间的依赖关系。

    关于cmake - 为什么使用 add_library({tgt} IMPORTED) 与 target_link_libraries(-l {.so | .a})?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49482691/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com