【问题标题】:To ensure the dependency package location is in the same as its dependent package确保依赖包位置与其依赖包相同
【发布时间】:2021-03-11 16:45:39
【问题描述】:

是否自动默认递归依赖的包位置与其上面的依赖包相同,还是我们必须确保,即告诉/指示Cmake,引用递归依赖包位置?

找到foobar

foreach(FOOB   foo  bar)
   find_library(FOO_${FOOB}_LIBRARY   ${FOOB}
        HINTS
          "/usr"
        PATH_SUFFIXES
            lib/
       )
    if(FOO_${FOOB}_LIBRARY)
        list(APPEND FOO_LIBRARIES ${FOO_${FOOB}_LIBRARY})
    endif()
   endforeach()
…
…

find_package_handle_standard_args(foobar
    REQUIRED_VARS
        FOO_LIBRARIES
)


foo.so 取决于:baz.so
bar.so 取决于:baz.so

baz.so会被Cmake规则自动在/usr/lib下找到,或者用什么语法来保证和命令Cmake去做?

【问题讨论】:

  • "baz.so 将通过 Cmake 规则自动在 /usr/lib 下找到" - 您显示的代码没有搜索 baz.so,所以我不明白什么是“自动找到”方法。 “foo.so 取决于:baz.so” - 也就是说,foo.sobaz.so链接?如果是,那么与foo.so 链接将自动与baz.so 链接。这不是 CMake 功能,而是链接器功能。

标签: cmake dependencies


【解决方案1】:

不,CMake 不会自动搜索baz.so。如果foo.sobar.so 的RPATH 设置正确或位于全局链接器搜索路径中(在您的情况下),那么链接foo.sobar.so 将在没有它的情况下正常工作。如果它们缺少 RPATH 并且不在全局链接器搜索路径中,则链接器将抱怨它在链接时找不到 baz.so

如果 foo.sobaz.so 的 RPATH 未设置,那么您应该添加 -rpath-link 链接器标志,即使在您的系统上它们位于全局搜索路径中,因为您项目的其他使用者可能已将它们安装在其他一些目录。这可以通过

# assumes foo was found, and both foo and bar are in the same directory
get_filename_component(LIBFOO_DIR ${FOO_foo_LIBRARY DIRECTORY)
target_link_options(<target-name>
  INTERFACE
    LINKER:-rpath-link,${LIBFOO_DIR}
)

其中&lt;target-name&gt; 是您用于libfoo 库的导入目标的名称。

【讨论】:

  • 是它?您能否完善真正需要案例的答案:foobar 是一个 Debian 测试包,由 Stable 之上的应用程序需要/调用,因此必须不要触摸,弄乱 Stable。从逻辑上讲,需要一个特殊的目录。包含任何包(即 foobar)以及应用程序正确调用的所有依赖项,它会顺利运行,同时防止操作系统破坏有害的测试安装
  • @memekindah 很抱歉我没能跟上,可能是因为我不知道 Debian 测试和稳定版是如何工作的,因为我以前从未使用过 Debian。如果您有一个特殊目录,其中foo.sobar.so,它们的依赖项和应用程序将被安装,您需要确保所有库的 RPATH/RUNPATH 设置为 $ORIGIN,否则它们可能会使用系统库而不是同一目录下的库,或者您需要为应用程序设置 RPATH(RPATH 会传播到依赖项,RUNPATH 不会)。
  • This 很好地概述了 RPATH/RUNPATH 是什么以及如何通过 CMake 设置它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-03
相关资源
最近更新 更多