在MacOS上编译一个动态库,库搜索路径指向同一目录(CMake)
Compiling a dynamic library on MacOS with library search path that points to the same directory (CMake)
我正试图使用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模块自动修复了这个问题,这可能值得一试。
- CMake 错误"源似乎不包含 CMakeLists.txt",路径/库连接问题
- CMake 错误 - 目标 foo INTERFACE_SOURCES属性包含在源目录中以前缀为前缀的路径
- 如何获取 CMake 单元测试的相对路径?
- Cmake:find_library不起作用,但find_path起作用(相同的路径)
- CMake 中的路径变量
- CMake 包含/源路径有效配置
- 如何在Cmake中正确查找头路径,以便在我的项目中构建Box2D
- CMake将依赖项复制到可执行输出路径
- CMake导出的库-在客户端应用程序中找不到include/Lib路径
- 如何设置 CMake 来构建包含路径包含的代码,如 #include < libdir/lib>?
- 从 make 调用 CMake 以获取系统库路径
- CMake 链接 2 个具有相对路径的库
- cmake find_package CMakeLists.txt 子文件夹中的相对路径
- cmake:包括vs vs add_subDirectory:相对标头文件路径
- 为什么 cmake findBoost 找不到系统提升路径?
- cmake find_package指定路径
- CMake 安装具有相对路径的目标
- 在 Ubuntu 16.04 下构建 Android linphone 给出了 CC 和 CXX 的 cmake 路径变
- gradle cmake在连接路径时添加意外的引号
- CMake为什么通过相对路径链接外部库