确保依赖包位置与其依赖包相同

To ensure the dependency package location is in the same as its dependent package

递归依赖的包位置是否自动默认与上面的依赖包相同,还是我们必须确保,即tell/instruct 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去做?

不,CMake 不会自动搜索 baz.so。如果 foo.sobar.so 正确设置了它们的 RPATH 或者位于全局 linker 搜索路径中(在你的情况下)然后 linking against foo.sobar.so 没有它也能正常工作。如果他们缺少 RPATH 并且不在全局 linker 搜索路径中,那么 linker 会抱怨它在 link 时间找不到 baz.so

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

完成
# 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}
)

其中 <target-name> 是您用于 libfoo 库的导入目标的名称。