在我无法找出正确的搜索词之前,可能已经提出过这个问题。
我正在编写一个客户端 - 服务器应用程序,在OSX桌面上运行,该桌面将与本地网络上的MySQL服务器通信。当基本上一堆SQL语句在内部完美时,实现Web服务API似乎很啰嗦。
我已经在我的开发机器上与MySQL服务器的安装程序搏斗,广告不得不求助于将libmysqlclient.18.dylib符号链接到/ usr / lib,即使我将包含路径放在标题搜索路径中。 / p>
我需要知道的是如何创建一个.app文件,我可以发送给可以访问libmysqlclient.18.dylib文件的其他机器?
虽然我已经为iDevices做了2年的Obj-c,但我已经习惯了安装程序的Windows,而且还有一些OSX编程的新功能。
是否有设置允许将库复制到.app文件中,或者我是否需要在每台机器上安装mysql连接器 - 如果是这样,我如何解决符号链接问题,理想情况下我需要它才能工作来自库存文件夹。
如果在其他地方已经回答了这个问题,请指出正确的方向。
答案 0 :(得分:1)
在构建时,OS X上的静态链接器ld将应用程序链接的每个库的共享库标识符写入应用程序二进制文件。在运行时,动态链接器dyld尝试从应用程序二进制文件中指定的路径加载每个共享库。您可以使用otool -L YourApp.app/Contents/MacOS/YourApp
来查看此信息。
您需要将libmysqlclient.18.dylib符号链接到/ usr / lib这一事实表明libmysqlclient.18.dylib的共享库标识符类似于/usr/lib/libmysqlclient.18.dylib。要以您的应用程序将使用它的方式将库包含在.app包中,而不是在/ usr / lib中查找,您需要:
更改libmysqlclient.18.dylib的共享库标识符,以便dyld查找相对于应用程序二进制文件的二进制文件。这通常是通过运行install_name_tool -id @executable_path/../Frameworks/libmysqlclient.18.dylib libmysqlclient.18.dylib
。
将修改后的libmysqlclient.18.dylib复制到应用程序包中的Frameworks subdirectroy。这通常使用Xcode项目中的“复制文件”构建阶段来完成。
然后,您应该能够验证写入应用程序二进制文件的安装名称是@executable_path/../Frameworks/libmysqlclient.18.dylib
而不是/usr/lib/libmysqlclient.18.dylib
(再次使用otool -L YourApp.app/Contents/MacOS/YourApp
)。如果安装名称不正确,那么您需要确保将链接器搜索路径设置为在您可能拥有的任何其他版本之前找到修改后的libmysqlclient.18.dylib版本。