gpt4 book ai didi

cmake - "config-style"cmake find_package 在父范围内不可用

转载 作者:行者123 更新时间:2023-12-02 17:11:50 25 4
gpt4 key购买 nike

我有以下结构

project_root/
CMakeLists.txt (A)
ext/
CMakeLists.txt (B)
apps/
CMakeLists.txt (C)

只有在添加这个新的“config-style”库时,设置似乎才是根本问题。

长话短说:当find_package(foo)在 (B) 中定义了 foo::foo作为图书馆,我怎样才能制作foo::foo在父范围内可用,因此 target_link_libraries(tgt foo)对 (A) 和 (C) 都有效吗?

  1. 列表 (A) 定义了我的项目的选项,例如要编译支持的驱动程序。
  2. add_subdirectory(ext)发生,并找到所需的外部库。它们是 add_subdirectory 的混合物和 find_package .列表 (B) 填充额外包含目录、库和编译时定义的列表,使它们可供 (A)(以及随后的 (C))使用

    set(MYPROJ_EXTRA_INC_DIRS "${MYPROJ_EXTRA_INC_DIRS}" PARENT_SCOPE)
    set(MYPROJ_EXTRA_LIBS "${MYPROJ_EXTRA_LIBS}" PARENT_SCOPE)
    set(MYPROJ_EXTRA_DEFINES "${MYPROJ_EXTRA_DEFINES}" PARENT_SCOPE)
  3. List (A) 现在添加我的库,包括这些额外的目录,添加这些额外的定义,最终

    target_link_libraries(${MYPROJ_LIB_NAME} ${MYPROJ_EXTRA_LIBS})
  4. 当请求构建应用程序时,add_subdirectory(apps)发生,列表 (C) 定义了一个简单的宏,它使用指定的依赖项创建可执行文件。相关部分

    target_link_libraries(${appName} ${MYPROJ_LIB_NAME} ${MYPROJ_EXTRA_LIBS})

这已经运行了很长时间。但是,我添加了对使用 config-style find_package 的新库的支持定义,我不知道如何正确使用它。

调用这个新的库依赖项 foo .它最终定义了一个 foo_LIBRARY这是foo::foo .我的理解是我需要做 target_link_libraries(tgt foo) ,它在我的图书馆的列表 (A) 中有效。但是,它不适用于应用程序,在宏中我必须做 find_package(foo)再次为每个可执行文件。

有没有办法使用现有方法 ( list(APPEND MYPROJ_EXTRA_LIBS <something>) ) 不需要 运行 find_package每次?

我已经用尽了所有合理的选择,要么得到 -lfoo未定义(如果我像我认为的那样将 foo 添加到列表中),或 find_package()缺少 IMPORTED 或 ALIAS 目标。又名自 find_package(foo)发生在 (B) 中,当我们到达 (C) 时,该目标不可用。我尝试制作别名,但错误是无法为导入的库创建别名。

最佳答案

find_package 调用的结果(CONFIGMODULE)旨在用于同一目录或以下目录。您很幸运,将变量简单传播到 PARENT_SCOPE 使得 find_package 的结果可供父级使用。

add_subdirectory(ext) takes place, and the needed external libraries are found.

不是 add_subdirectory 中包含的 ext/CMakeLists.txt 创建 CMake 文件(例如 external.cmake)以通过 包含包括。因为 include 命令不引入新变量的范围,它的 find_package 调用适用于主要的 CMakeLists.txt

许多现有项目在 include 文件中处理它们的依赖关系。


另一种方法是通过创建自身使用这些结果的 INTERFACE 库目标将 find_package 调用的结果从子目录传播到父目录:

add_library(MyLibExtra INTERFACE)
target_link_libraries(MyLibExtra INTERFACE ${MYPROJ_EXTRA_LIBS})
target_include_directories(MyLibExtra INTERFACE ${MYPROJ_EXTRA_INC_DIRS})
target_compile_definitions(MyLibExtra INTERFACE ${MYPROJ_EXTRA_DEFINES})

关于cmake - "config-style"cmake find_package 在父范围内不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48737960/

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