2012-02-19 65 views
1

我的應用程序需要libcurl的第7版,並在Lion上正常工作,但Snow Leopard上的libcurl.dylib版本無效(我需要*前綴* MKD命令)。 (1)應用程序文件夾,(2)內容文件夾,(3)MacOS文件夾和(4)應用程序文件夾中的副本, )資源文件夾,但沒有成功。甚至四個副本,每個文件夾一個。 (仍然到/ usr/lib。)強制OS X應用程序使用特定的libcurl.dylib

我也嘗試在Xcode 4.2中將「Runpath Search Paths」設置爲「。」,但這並沒有幫助。

因此,問題1是,我如何強制我的雪豹應用程序使用包含在包中的dylib? (安裝一個新的libcurl.dylib是不可能的 - 這個應用程序將進入Mac App Store。)

在實驗上,我將Snow Leopard系統上的/usr/lib/libcurl.dylib替換爲獅子,並與該應用程序的工作。所以我知道,如果我可以讓應用程序使用這個庫,它會工作正常。

我也試過建立一個靜態的libcurl.a,它工作(使用configure,make和make install),但試圖鏈接到應用程序仍然引用dylib。然後,我將靜態庫的名稱更改爲libcurl-static.a,但之後出現鏈接器錯誤,因爲其他dylib中未定義數十個符號。我試圖在我的構建中包含更多的dylib,以解決這些問題,但libcurl所需的dylib列表顯然很長。我試圖用otool找出需要的東西,但沒有一個選項讓我看到有用的東西。

問題#2是:如何將我的應用程序靜態鏈接到libcurl?我有一個解決方法,不能使用* MKD,如果該目錄已經存在,它忽略錯誤,但它涉及太多額外的FTP操作,效率低下。我的方法* MKD工作正常,是快速。)

不需要建議我去另一個FTP庫,因爲我已經想到了。真的不想,因爲libcurl在Lion上工作得很好。如果只有我可以讓它使用我在雪豹上運送的圖書館。

回答

0

1)您必須更改庫的ID(在鏈接之前) - 默認情況下,它將指向/usr/lib/,這不是您運送它的地方。見otool -L

$ otool -L /usr/lib/libcurl.4.dylib | head -n 2 
/usr/lib/libcurl.4.dylib: 
    /usr/lib/libcurl.4.dylib (compatibility version 6.0.0, current version 6.1.0) 

要改變尤其你可能想使用@executable_path/前綴對應可執行文件的位置,您使用的install_name_tool -id new/path/libcurl.4.dylib your/copy/of/libcurl.4.dylib ID。另外,您可以用install_name_tool -change /usr/lib/libcurl.4.dylib @executable_path/libcurl.4.dylib yourapp

2)改變路徑在編譯的二進制通過使用圖書館的名稱,以便代替-lcurl您只需使用libcurl.a(有完整路徑,如果它不在當前目錄)強制靜態鏈接 - 我會強烈推薦這條路,它會導致更少的頭痛。 PS:我不確定您是否可以合法運送Apple的libcurl(您可能,我不知道) - 但是很容易從Apple的源代碼直接爲SL編譯,從而避免任何Lion問題。

+0

非常感謝#1。對於#2,我的問題不是關於如何獲取libcurl.a,而是關於如何讓所有引用的庫得到解決。 我決定libcurl方法不是我想要去的。將代碼切換到CFFTP,現在它在10.6和10.7上運行得非常好。 – 2012-02-20 19:14:16

+0

通過列出它們來解決依賴關係 - 沒有隱式依賴關係解析,只有顯式的。這通常沒有問題,因爲通常在配置時或通過自我報告(例如'pkgconfig')完成。 – 2012-02-21 01:55:05