我尝试使用CMake在MacOS上编译dylib。我的库动态链接到其他一些库,我想用我的库发送它们。为此,我需要确保在加载库时,无论其位置如何,都从同一文件夹加载依赖库。我相信它与rpath有关,但我不是这里的专家。你能建议一种使用CMake实现这个目标的方法吗? (我想需要通过-Wl,-rpath或类似的
提供一些链接器选项提前致谢!
答案 0 :(得分:2)
这是我在我的CMake脚本中所做的事情,以便从与我的二进制文件(可执行文件和其他库)相同的目录加载共享库:
SET(CMAKE_BUILD_WITH_INSTALL_RPATH true)
SET(CMAKE_INSTALL_RPATH "$ORIGIN/")
(使用CMake 3.0 +测试)
它是如何工作的(我的理解):第二行告诉CMake将$ ORIGIN特殊字符串添加到二进制搜索文件夹中(这个特殊的$ ORIGIN字符串是"由操作系统替换"在执行时,包含执行二进制文件的文件夹。因此,将正确找到包含此字符串的二进制文件旁边的所需库。
但是,在CMake中设置此变量只会影响安装时二进制文件(例如,使用 make install 部署的二进制文件):CMake不会更改搜索在构建阶段创建的二进制文件中的路径,但仅在安装它们时才会生成。
由于我没有使用CMake安装功能,而且我只想在可自由重定位的文件夹中提供我的应用程序,所以我使用了第一个调用,告诉CMake在构建时使用安装时搜索路径,太
因此,通过这两个调用,在CMake生成的makefile上调用 make (或使用XCode构建)将创建二进制文件,并将搜索文件夹正确设置为$ ORIGIN。
请在定义任何其他目标之前执行此操作。您还可以使用带有BUILD_WITH_INSTALL_RPATH和INSTALL_RPATH属性的set_target_property为各个目标自定义这些设置。
我只在Linux 下对此进行了测试,但如果MacOS X的行为方式相同,那么这应该没问题。
希望这有帮助
本杰明
答案 1 :(得分:0)
Linux $ {ORIGIN}技巧不起作用。在macOS上,库依赖项默认指定为绝对路径(otool -L mylib.dylib
)。
要有相对路径(例如,相同的文件夹)我认为正确的方法是将主库中的依赖库的安装名称(使用install_name_tool -change ...
)更改为 @ rpath / other .dylib 在可执行文件(dylib)中使用正确的rpath,或者只是 @ executable_path / other.dylib 。
关于CMake,我已成功使用CMake BundleUtilities模块自动修复此问题,可能值得一试。