2013-01-18 35 views
0

在我找不到合適的術語進行搜索之前,可能已經提出了這個問題。OSX Xcode - 打包依賴libmysqlclient.18.dylib

我正在編寫一個客戶端 - 服務器應用程序在OSX桌面上運行,該桌面將與本地網絡上的MySQL服務器進行通信。當基本上一堆SQL語句在內部是完美的時候,實現一個web服務API似乎很囉嗦。

我已經在我的開發機器上爲MySQL服務器的安裝過程摔跤了,即使我將包含路徑放在頁眉搜索路徑中,ad也不得不求助於將libmysqlclient.18.dylib鏈接到/ usr/lib中。

我需要知道的是如何創建一個.app文件,我可以發送給其他可以訪問libmysqlclient.18.dylib文件的機器?

我習慣於Windows有安裝程序來做到這一點,並有點新的OSX編程,雖然我一直在爲iDevices做Obj-c 2年。

是否有一個設置,允許圖書館複製到.app文件還是需要安裝每臺機器上的MySQL連接器 - 如果是這樣,我怎麼周圍的符號鏈接問題得到,最好我需要它從股票文件夾工作。

如果在別的地方回答了這個問題,請指出我的方向。

回答

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中,你需要:

  1. 變化libmysqlclient.18.dylib的共享庫標識符,這樣dyld將查找與您的應用程序二進制文件相關的二進制文件。這通常通過運行install_name_tool -id @executable_path/../Frameworks/libmysqlclient.18.dylib libmysqlclient.18.dylib完成。

  2. 將修改後的libmysqlclient.18.dylib複製到應用程序捆綁中的Frameworks子目錄中。這通常是在Xcode項目中使用Copy Files構建階段完成的。

然後,您應該能夠驗證寫在你的應用程序二進制安裝的名字是@executable_path/../Frameworks/libmysqlclient.18.dylib而非/usr/lib/libmysqlclient.18.dylib(再次使用otool -L YourApp.app/Contents/MacOS/YourApp)。如果安裝名稱不正確,那麼您需要確保鏈接器搜索路徑設置爲在您可能具有的任何其他版本之前找到您的修改後的libmysqlclient.18.dylib版本。

+0

這看起來更像是對我這樣做的正確方式,因爲我對工具鏈有點新,我在今天凌晨的凌晨發現了一個解決方法,它靜態鏈接庫,在其他鏈接器標記中將路徑放入.a文件並在其之前省略-l,應用程序大小增加.a文件的大小,並在將應用程序包複製到未安裝mysql的另一臺計算機時工作。我寧願以正確的方式做。如果其他人提出了其他建議,如果沒有的話,會將問題留待一兩天,以接受您的答案。謝謝bdash :) – JamesB

+0

接受你的答案,謝謝,效果很好。 – JamesB

+0

@bdash我試着按照你的建議,但二進制文件中的安裝名稱沒有改變。如何設置鏈接器搜索路徑以查找libmysqlclient.18.dylib的修改版本?我將該文件從安裝目錄複製到應用程序項目目錄,然後像上面那樣運行install_name_tool。然後我將修改後的庫文件拖到Xcode –

相關問題