如何在Cocoa应用程序中捆绑库?

时间:2011-02-28 23:05:20

标签: cocoa

我有一个库libmysqlclient.16.dylib,我需要在运行我的应用程序的计算机上使用它,否则我将收到以下错误:

  

Dyld错误消息:库没有   加载:   /usr/local/mysql/lib/libmysqlclient_r.16.dylib   参考自:/ Users / alex / snow   server 3.app/Contents/MacOS/snow   服务器原因:未找到图像

这很奇怪,因为我将二进制文件与此库链接。

如果目标计算机上存在相同的dylib,但是版本不同(例如,Snow Leopard Server),则会出现如下错误:

  

Dyld错误消息:库没有   加载:   /usr/local/mysql/lib/libmysqlclient_r.16.dylib   参考自:/ Users / alex / snow   server 3.app/Contents/MacOS/snow   服务器原因:没有合适的图像   找到。找到了:     /usr/local/mysql/lib/libmysqlclient_r.16.dylib:   mach-o,但错误的架构

我想链接到这个库,但不必使用它的本地副本。这可能吗?

更新 - 当我尝试使用install_name_tool时,我没有任何更改:

  

bash-3.2#otool -L   libmysqlclient.16.dylib   libmysqlclient.16.dylib:     libmysqlclient.16.dylib   (兼容版本16.0.0,当前   版本16.0.0)     /usr/lib/libSystem.B.dylib   (兼容版本1.0.0,当前   版本123.0.0)     /usr/lib/libz.1.dylib(兼容性   版本1.0.0,当前版本1.2.3)     /usr/lib/libstdc++.6.dylib   (兼容版本7.0.0,当前   版本7.9.0)bash-3.2#   install_name_tool -change   libmysqlclient.16.dylib   @executable_path /../框架/ libmysqlclient.16.dylib   用法:install_name_tool [-change old   新] ... [-rpath old new] ...   [-add_rpath new] ... [-delete_rpath   老] ... [-id name]输入bash-3.2#   install_name_tool -change   libmysqlclient.16.dylib   @executable_path /../框架/ libmysqlclient.16.dylib   libmysqlclient.16.dylib bash-3.2#   otool -L libmysqlclient.16.dylib   libmysqlclient.16.dylib:     libmysqlclient.16.dylib   (兼容版本16.0.0,当前   版本16.0.0)     /usr/lib/libSystem.B.dylib   (兼容版本1.0.0,当前   版本123.0.0)     /usr/lib/libz.1.dylib(兼容性   版本1.0.0,当前版本1.2.3)     /usr/lib/libstdc++.6.dylib   (兼容版本7.0.0,当前   版本7.9.0)

我在构建阶段添加了一个脚本: install_name_tool -change libmysqlclient.16.dylib @executable_path /../ Frameworks / libmysqlclient.16.dylib $ CONFIGURATION_BUILD_DIR / $ PRODUCT_NAME.app / Contents / MacOS / $ PRODUCT_NAME 这修复了一个执行产品的libpath,并且与lib一起工作正常。

1 个答案:

答案 0 :(得分:1)

首先,您需要确保将此库复制到应用程序包中,以便在用户的计算机上可用。为此,请为应用程序添加新的“复制文件”构建阶段,以复制捆绑的框架。在该构建阶段的属性中,确保目标是Frameworks。将您的库从项目拖到该构建阶段,以确保它与您的应用程序一起打包。

您可能还需要修改库本身,使其指向应用程序包中的正确位置。在过去,我通过在项目目录中复制库来完成此操作,然后使用以下命令修改库期望找到的位置:

install_name_tool -id @executable_path/../Frameworks/libftd2xx.0.1.0.dylib libftd2xx.0.1.0.dylib

在这种情况下,被修改的库称为libftd2xx.0.1.0.dylib

您可以使用命令

otool -L [library filename]

查看库期望自己找到的路径,并确定是否需要进行此更改。

确保在Xcode项目中更改库的路径,以便链接到位于项目目录中的库的新修改版本。