如何避免在 C++ 项目 (XCode) 中加载其他机器上的动态库?

How to avoid loading dynamic libraries on other machine in C++ project (XCode)?

我正在 Xcode 中使用 OpenCV 为 OS X 创建 C++ Unity 插件。该插件编译并在我的 Mac 上运行,但在其他机器上它会尝试加载动态来自 /usr/local/opt 的库(例如,ffmpeg、libtiff、webp)...(未加载库:/usr/local/opt/webp/lib/libwebp.6.dylib 等)

Brew install 解决了问题,但是需要分发这个插件"as is"。

我有两个问题: 1) 我怎么知道我的项目是否会尝试使用动态库(在其他机器上)?

2) 我怎样才能让我的项目从包中加载它们,而不是从 /usr/local/opt 中加载它们? (我用 -static 尝试 link,但是有 136 个错误“架构未定义的符号 x86_64 - _OSSpinLockLock,_dispatch_get_global_queue 和许多其他的)。

我不确定如何回答您的第一个问题...如果您不知道您的项目链接到哪些库,谁知道?

对于第二个问题。你需要设置动态库的'install name'。您会很容易找到关于它的详细信息以及关于可用于操作它的 install_name_tool 命令行的详细信息,但本质上它是一个刻在 .dylib 本身内部的变量,用于存储路径。该路径告诉链接到它的二进制文件在哪里可以找到它。当您将 dylib 捆绑在您的可部署文件中时,您的安装名称通常设置为类似 @executable_path/path/relative/to/executable/ 的名称。 安装名称可以在编译库时设置为编译器标志,也可以稍后在 dylib 文件上使用 install_name_tool 设置。

另请注意 Xcode 构建设置中的 'Runpath Search Path' 选项与此相关。

我希望这足以为您指明所需的方向。