Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在MacOS上编译动态库,库搜索路径指向同一目录(CMake)_C++_Macos_Linker_Cmake_Rpath - Fatal编程技术网

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

C++ 在MacOS上编译动态库,库搜索路径指向同一目录(CMake),c++,macos,linker,cmake,rpath,C++,Macos,Linker,Cmake,Rpath,我正在尝试使用CMake在MacOS上编译动态库。我的库动态链接到一些其他库,我想将它们与我的库一起发布。为此,我需要确保在加载库时,依赖库从同一文件夹加载,而不管其位置如何。我相信这与rpath有关,但我不是这里的专家。您能建议一种使用CMake实现这一点的方法吗?(我想您需要通过-Wl、-rpath或类似方式提供一些链接器选项 提前感谢!以下是我在CMake脚本中为从与二进制文件(可执行文件和其他库)相同的目录加载共享库所做的操作: (使用CMake 3.0+进行测试) 工作原理(我的理解)

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


提前感谢!

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

(使用CMake 3.0+进行测试)

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

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

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

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

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

我只在Linux下测试过这一点,但如果MacOS X的行为方式与此相同,则应该可以

希望这有帮助


Benjamin

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

要拥有相对路径(例如,相同的文件夹),我认为正确的方法是将主库中依赖库的安装名称(使用
install\u name\u tool-change…
)更改为类似@rpath/other.dylib的名称,并在可执行文件(dylib)中使用正确的rpath,或者在您的情况下只使用@executable\u path/other.dylib

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

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