在MacOS上编译一个动态库,库搜索路径指向同一目录(CMake)

Compiling a dynamic library on MacOS with library search path that points to the same directory (CMake)

本文关键字:CMake 路径 搜索 动态 MacOS 编译 一个      更新时间:2023-10-16

我正试图使用CMake在MacOS上编译一个dylib。我的库与其他一些库动态链接,我想将它们与我的库一起运送。为此,我需要确保在加载库时,无论其位置如何,都会从同一文件夹加载依赖库。我相信这与rpath有关,但我不是这里的专家。你能建议一种使用CMake实现这一目标的方法吗?(我想需要通过-Wl、-rpath或类似的提供一些链接器选项

提前感谢!

以下是我在CMake脚本中为共享库所做的操作,共享库将从与二进制文件(可执行文件和其他库)相同的目录中加载:

SET(CMAKE_BUILD_WITH_INSTALL_RPATH true)
SET(CMAKE_INSTALL_RPATH "$ORIGIN/")

(使用CMake 3.0+测试)

它的工作原理(我的理解):第二行告诉CMake将$ORIGIN特殊字符串添加到二进制文件搜索文件夹中(在执行时,这个特殊的$ORIGIN字符串被OS"替换"为包含执行二进制文件的文件夹。因此,将正确找到包含此字符串的二进制文件旁边所需的库)。

但是,在CMake中设置此变量只会影响安装时间二进制文件(例如,使用make install部署的二进制文件):CMake不会更改在构建阶段创建的二进制文件中的搜索路径,而只会在安装时更改。

由于我没有使用CMake安装功能,并且我只想在一个可自由重新定位的文件夹中提供我的应用程序,所以我使用了第一个调用,即告诉CMake在构建时也使用安装时搜索路径。

因此,通过这两个调用,在CMake生成的makefile上调用make(或者使用XCode构建,我想)将创建二进制文件,并将搜索文件夹正确设置为$ORIGIN。

请在定义任何其他目标之前执行此操作。还可以通过将set_target_property与BUILD_with_INSTALL_RPATH和INSTALL_RPATH属性一起使用,为各个目标自定义这些设置。

我只在Linux下测试过这一点,但如果MacOS X以同样的方式运行,这应该没问题。

希望这能帮助

Benjamin

Linux${ORIGIN}技巧将不起作用。在macOS上,库依赖项默认指定为绝对路径(otool -L mylib.dylib)。

要获得相对路径(例如,相同的文件夹),我认为正确的方法是将主库中依赖库的安装名称(使用install_name_tool -change ...)更改为类似于@rpath/other.dylib的名称,并在可执行文件中使用正确的rpath(dylib),或者在您的情况下仅更改为@executable_path/other.dyleb.

关于CMake,我已经成功地使用CMakeBundleUtilities模块自动修复了这个问题,这可能值得一试。