【问题标题】:install EXPORT problem for library with dependencies为具有依赖关系的库安装 EXPORT 问题
【发布时间】:2011-03-21 13:51:15
【问题描述】:

我尝试从一个项目构建两个库(比如 AB)。我在根 cmake 文件中使用 add_subdirectory cmake 命令。 B 依赖于A

当我尝试添加时

INSTALL (TARGETS B EXPORT B
    PUBLIC_HEADER DESTINATION "include/B"
    LIBRARY DESTINATION "lib"
    ARCHIVE DESTINATION "lib")

INSTALL (EXPORT B DESTINATION "./")

CMake 会根据 INSTALL (EXPORT ... 向我发出错误警告。它打印:

CMake 错误:INSTALL (EXPORT "B" ...) 包括目标“B”,它需要不在导出集中的目标“A”。

【问题讨论】:

    标签: dependencies export cmake


    【解决方案1】:

    错误消息已经告诉您,您只导出一个项目,而它依赖于另一个项目。最简单的解决方案是导出两个项目。如果它们都是由相同的 CMakeLists.txt 构建的,您可以简单地调用

    install( TARGETS A B ... )
    

    如果没有,那么您可能有一个顶级 CMakeLists.txt(您在其中使用 add_subdirectory)。您可以在那里设置一个安装目标,我们称之为“MyInstall”。并在您的子目录中引用此顶级安装目标

    在您的子目录中...

    install( TARGETS A EXPORT MyInstall ... )
    

    目标 B 类似,然后导出“MyInstall”您的顶级 CMakeLists.txt:

    install( EXPORT MyInstall ... )
    

    【讨论】:

    • 如果要安装的共享库依赖于将成为共享库一部分的静态库怎么办?在这种情况下,我不需要安装静态库,但 CMake 仍然要求静态库转到相同的导出。
    • 查看这里了解更多信息:stackoverflow.com/questions/40183810/…
    【解决方案2】:

    除了修复

    不在导出集中的“A”

    部分错误信息,可以考虑修复部分

    目标“B”需要目标“A”

    通过使用BAPRIVATE 链接:

    target_link_libraries(B PRIVATE A)
    

    这种链接意味着A 仅用于构建库B,但对于与B 链接的任何人都不需要。

    这取决于库B 这样的链接是否足够。 但如果是,那么这是克服错误的一种更可取的方法:如果B 的用户不需要与A 链接,则没有理由导出A


    当 PRIVATE 链接不是一种选择时,有一些简单的迹象:

    1. B 的某些public 标头包含库A 的标头。 在这种情况下,如果用户#include-s B 的标头,那么A 的标头也将被包括在内。为了找到该头文件,编译器应该知道 A 的包含目录。
    2. B 是一个 STATIC 库,A 是 STATIC 或 SHARED。 在这种情况下,B 的二进制文件不会“嵌入”A 的二进制文件。 因此,当与B 链接时,也应明确地与A 链接。

    但是,如果 AB 都是共享库,那么 PRIVATE 链接仍然是一种选择:

    虽然共享B 的二进制文件没有“嵌入”共享A 的二进制文件,但B 的二进制文件包含对A 二进制文件的引用 .因此,当链接器在命令行中找到B 二进制文件时,它也会链接到A 二进制文件。如果安装了B,那么也应该安装A(否则链接器将找不到A)。但是为了能够导出B,不需要导出A

    【讨论】:

      猜你喜欢
      • 2022-01-27
      • 2013-05-03
      • 2019-02-26
      • 2011-06-06
      • 1970-01-01
      • 2015-11-22
      • 1970-01-01
      • 2020-09-29
      • 2017-12-23
      相关资源
      最近更新 更多