簡體   English   中英

如何讓Xcode使用Boost Filesystem鏈接和調試應用程序?

[英]How can I get Xcode to link and debug an app with Boost Filesystem?

TL; DR

Objective-C app與靜態庫鏈接,動態鏈接Boost Filesystem。 可以使用終端從輸出目錄運行應用程序,但嘗試從Xcode調試器或Finder運行會出現錯誤dyld: Library not loaded: libboost_filesystem.dylib <snip> Reason: image not found

問題

在我的Xcode項目中,我有一個如下所示的結構:

MainProject (Objective-C)
 - static_lib_that_uses_filesystem (C++)

為了獲得所有鏈接,我將libboost_system和libboost_filesystem dylibs添加到MainProject中的“Link Binary with Libraries”構建階段。

當我嘗試從Xcode或Finder運行應用程序時,我得到:

sharedlibrary apply-load-rules all
warning: Unable to read symbols for libboost_filesystem.dylib (file not found).
warning: Unable to read symbols from "libboost_filesystem.dylib" (not yet mapped into memory).
warning: Unable to read symbols for libboost_system.dylib (file not found).
warning: Unable to read symbols from "libboost_system.dylib" (not yet mapped into memory).
[Switching to process 43957 thread 0x0]
dyld: Library not loaded: libboost_filesystem.dylib
  Referenced from: /Users/ssteele/Library/Developer/Xcode/DerivedData/MainProject-dqrhyuarllykslftblocjdzxlran/Build/Products/Debug/MainProject.app/Contents/MacOS/MainProject
  Reason: image not found

我添加了一個構建階段,將dylib復制到bundle中的Frameworks目錄,這沒有用。 我更改了它以將它們復制到Executables目錄,這也沒有幫助。

將它們放在Executables目錄允許我從終端運行應用程序。

從Finder / Xcode運行時,如何讓應用程序找到dylib?

背景資料

我在Lion上使用Xcode 4.2,目前只針對Lion。 我為文件系統構建了我的共享庫,如下所示:

./b2 threading=multi macosx-version=10.7 --with-filesystem stage

這會創建libboost_system.dylib,libboost_filesystem.dylib,以及stage / lib目錄中的.a等效項,我直接在那里引用它們。

OSX上的動態庫(dylib)在應該從中加載的路徑中進行烘焙。 例如...

/usr/lib/some_awesome.dylib

鏈接到dylib時,鏈接器會將此路徑嵌入可執行文件中,作為在運行時查找它的位置。 使用已安裝的庫這很簡單,但是對於相對路徑鏈接,它更復雜。

當你構建boost庫時,他們只是嵌入了他們的名字而不是完整或相對路徑(即libboost_system.dylib而不是/usr/lib/libboost_filesystem.dylib )。 您應該可以使用dll-path 選項更改此設置,但目前似乎已損壞

要解決您的問題,您需要以某種方式將相對於嵌入式應用程序的正確路徑(例如@executable_path/libwhatever.dylib )放入dylibs,這可能需要bjam dll-path選項才能工作,或者您可以修復可執行文件以查看其他位置。

為此,請使用以下內容作為構建中的腳本步驟:

install_name_tool -change libboost_filesystem.dylib @executable_path/libboost_filesystem.dylib$BUILT_PRODUCTS_DIR/$EXECUTABLE_PATH

請注意,如果您有多個使用損壞路徑相互引用的dylib,則還需要修復它們之間的路徑,例如

install_name_tool -change libboost_system.dylib @executable_path/libboost_system.dylib$BUILT_PRODUCTS_DIR/$EXECUTABLE_FOLDER_PATH/libboost_filesystem.dylib

以下是一篇很好的文章: 創建工作dylibs

問題是需要安裝boost,例如b2 ..... install 這會將庫和標頭復制到/ usr / local / lib和/ usr / local / include中。

OSX動態庫僅從為其構建的目錄運行。

您可以使用-prefix參數來更改安裝目錄以進行boost構建。 但是,庫仍然需要位於所有用戶的同一目錄中。

應該有一種方法來構建boost作為框架和/或在庫中嵌入@executable_path。

另一種方法是使用boost的靜態庫 - 僅構建靜態或刪除動態庫,Xcode在靜態之前查找動態。 如果使用static,那么庫的路徑在運行時無關緊要,因為所有代碼現在都在可執行文件中。

我想你需要在“庫搜索路徑”中添加保存libboost_filesystem.a的目錄的路徑

單擊項目配置文件 - >構建設置 - >展開“搜索路徑” - >“庫搜索路徑”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM