确保依赖包位置与其依赖包相同
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.so
和 bar.so
正确设置了它们的 RPATH 或者位于全局 linker 搜索路径中(在你的情况下)然后 linking against foo.so
或 bar.so
没有它也能正常工作。如果他们缺少 RPATH 并且不在全局 linker 搜索路径中,那么 linker 会抱怨它在 link 时间找不到 baz.so
。
如果 foo.so
或 baz.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
库的导入目标的名称。
递归依赖的包位置是否自动默认与上面的依赖包相同,还是我们必须确保,即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.so
和 bar.so
正确设置了它们的 RPATH 或者位于全局 linker 搜索路径中(在你的情况下)然后 linking against foo.so
或 bar.so
没有它也能正常工作。如果他们缺少 RPATH 并且不在全局 linker 搜索路径中,那么 linker 会抱怨它在 link 时间找不到 baz.so
。
如果 foo.so
或 baz.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
库的导入目标的名称。