2011-02-28 45 views
1

我有庫libmysqlclient.16.dylib,我必須在我的應用程序運行在計算機上,或者我會收到以下錯誤:如何在Cocoa應用程序中捆綁庫?

Dyld Error Message: Library not loaded: /usr/local/mysql/lib/libmysqlclient_r.16.dylib Referenced from: /Users/alex/snow server 3.app/Contents/MacOS/snow server Reason: image not found

這是很奇怪的,因爲我掛二進制與此庫。

如果存在目標計算機上的相同dylib,但是在不同的版本(例如,雪豹服務器),我得到一個錯誤這樣的:

Dyld Error Message: Library not loaded: /usr/local/mysql/lib/libmysqlclient_r.16.dylib Referenced from: /Users/alex/snow server 3.app/Contents/MacOS/snow server Reason: no suitable image found. Did find: /usr/local/mysql/lib/libmysqlclient_r.16.dylib: mach-o, but wrong architecture

我想對鏈接這個庫,但不必使用它的本地副本。這可能嗎?

UPDATE - 當我嘗試使用install_name_tool我沒有任何變化:

bash-3.2# otool -L libmysqlclient.16.dylib libmysqlclient.16.dylib: libmysqlclient.16.dylib (compatibility version 16.0.0, current version 16.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3) /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0) bash-3.2# install_name_tool -change libmysqlclient.16.dylib @executable_path/../Frameworks/libmysqlclient.16.dylib Usage: install_name_tool [-change old new] ... [-rpath old new] ... [-add_rpath new] ... [-delete_rpath old] ... [-id name] input bash-3.2# install_name_tool -change libmysqlclient.16.dylib @executable_path/../Frameworks/libmysqlclient.16.dylib libmysqlclient.16.dylib bash-3.2# otool -L libmysqlclient.16.dylib libmysqlclient.16.dylib: libmysqlclient.16.dylib (compatibility version 16.0.0, current version 16.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 123.0.0) /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.3) /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)

SOLUTION 我是添加腳本到構建階段: install_name_tool -change libmysqlclient.16.dylib @ executable_path /../ Frameworks/libmysqlclient.16.dylib $ CONFIGURATION_BUILD_DIR/$ PRODUCT_NAME.app/Contents/MacOS/$ PRODUCT_NAME 這已修復了執行產品的libpath,並且在捆綁中正常工作。

回答

1

首先,您需要確保將這個庫複製到應用程序包中,以便它可以在用戶的​​機器上使用。爲此,請爲您的應用程序添加一個新的Copy Files構建階段,以複製捆綁的框架。在構建階段的屬性中,確保目標是框架。將您的庫從您的項目拖到該構建階段,以確保它與您的應用程序一起打包。

您可能還需要修改庫本身,以便它指向應用程序包內的正確位置。在過去,我已經讓我的項目目錄內的庫的副本,然後使用以下命令來修改,其中文庫希望找到自己做到了這一點:

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項目中更改了庫中的路徑,以便您將鏈接到駐留在項目目錄中的庫的此新修改版本。

+0

如果我將使用libmysql.a - 這意味着庫將在代碼中沒有動態加載,我不需要做任何複製? – Alex 2011-02-28 23:56:31

+0

@Alex - 是的,如果您使用靜態庫,它將鏈接到您的二進制文件中。但是,請謹慎對待圖書館的許可證,以確保您不會因爲這樣做而污染您的應用程序。首先,你需要使用其中一個LGPL版本的MySQL,因爲基礎版本是GPL:http://www.mysql.com/about/legal/licensing/index.html。如果鏈接到LGPL靜態庫中,則可能需要爲應用程序釋放目標文件以符合LGPL許可證。賠率是,你在這裏使用GPL版本的MySQL,所以你需要支付商業許可證。 – 2011-03-01 02:32:47

+0

tnx,但我做了一樣,你告訴並有錯誤:dyld:庫未加載:libmysqlclient.16.dylib 引用從/ Users/mac/Library/Developer/Xcode/DerivedData/snow-dnqbsbmaqlhtddanrxjajfdqlqtf/Build /產品/調試/下雪server.app/Contents/MacOS/snow服務器 原因:圖像未找到 我是添加複製文件階段並添加我的libmysqlclient.16.dylib(目的地 - 框架) – Alex 2011-03-01 08:54:12

相關問題