如何使带有自制库的 Xcode 项目可移植?

2am*_*2am 6 opengl macos xcode homebrew freetype

我已经使用 Brew 在我的 mac 上安装了 FreeType。我的 mac 上的代码工作正常,但是当我尝试在其他 mac 上运行该项目时,我收到下面提到的链接错误。

dyld: Library not loaded: /usr/local/opt/freetype/lib/libfreetype.6.dylib
Referenced from: /Users/ashutosh/Library/Developer/Xcode/DerivedData/InstrumentChamp- 
etytleaabhxmokadgrjzbgtmwxfl/Build/Products/Debug/instrumentchamp.app/Contents/MacOS/instrumentchamp
Reason: image not found (lldb) 
Run Code Online (Sandbox Code Playgroud)

当我尝试在其他 Mac 上运行代码时,Freetype 的所有库目录和包含目录都包含在项目的“$SRCROOT/”目录中。

您在库的链接错误中看到的路径是brew 在我创建此项目的mac 中安装freetype 的位置。

/usr/local/opt/freetype/lib/libfreetype.6.dylib
Run Code Online (Sandbox Code Playgroud)

我已将所需的所有 lib/ include/ 目录复制到我的项目的主文件夹中。
我已经在 Xcode 中设置了库并包含路径。

我在这里缺少什么?我还需要做什么才能使我的代码在任何其他 Mac 上可移植。我通过安装 Brew 让项目在其他 Mac 上运行,但我想不需要安装 Brew 即可完成此操作。

PS:我必须使用brew安装freetype,因为我无法为32位处理器的freetype编译.dylib,.dylib的64位副本给我错误,例如“错误的架构!”

And*_*man 4

我在评论中得到的基本想法是,OS X 在搜索库的位置方面非常愚蠢,它将使用编译期间使用的相同绝对路径在运行时解析它们。

通常,当您想要将应用程序部署/分发到与构建应用程序的计算机不同的计算机时,您将在安装包/捆绑包中包含您的库。但是您可能希望它们在运行时使用相对于您的应用程序的路径,因此 install_name_tool -change 允许您用相对路径替换令人讨厌的绝对路径。

希望这是有道理的,苹果让在 OS X 上使用系统范围的框架变得非常容易,但自定义库就不那么容易了。如果您使用系统范围的框架进行编译,/System/Library/Frameworks/...则在所有 OS X 安装上普遍可用(给定相同的目标发行版本)。


为了解决您的问题,我将执行以下操作:

install_name_tool -change /usr/local/opt/freetype/lib/libfreetype.6.dylib @executable_path/lib/libfreetype.6.dylib <executable_name_here>

然后它将停止在编译软件时的位置查找 libfreetype.6.dylib ,而是相对于运行时可执行文件的位置(在本例中为 sub-directory lib/)搜索它。