2013-02-17 29 views
4

我完全不熟悉Xcode和Objective-C,但是有經驗的(網絡)程序員。我想創建一個包含自制框架的應用程序。Xcode:將全新的框架鏈接到全新的應用程序失敗,並顯示「未找到圖像」

現在我讀了很多關於它的內容,我想我已經理解了OS X如何解決運行時的依賴關係以及@rpath,@executable_path和@loader_path的作用。

我做了以下建立一個框架:

  1. 創建一個名爲Test的新Cocoa框架。
  2. 將安裝目錄設置爲「@rpath」。
  3. 將「Test.h」添加到公共標題。
  4. 點擊運行。
  5. 右鍵單擊Test.framework下的「Products」,選擇Show in Finder。它是該項目的「Debug」目錄中名爲「Test.framework」的目錄。它似乎有合理的內容(版本/目錄和符號鏈接到「頭」,「資源」和「測試」二進制)

我做了以下內容來創建應用程序:

  1. 創建新的名爲「TestApp」的Cocoa應用程序。
  2. 將測試框架添加到項目中。 選擇「將文件添加到項目」。 從Test框架項目的「Release」目錄中選擇「Test.framework」目錄。 「將項目複製到目標組的文件夾」被選中 保留「爲任何添加的文件夾創建組」。上。
  3. 確保框架文件被複制到應用程序包。 選擇「添加構建階段」 - >「添加複製文件」 將Test.framework文件夾(或組?)從側邊欄拖到「複製文件」區域。
  4. 添加一個名爲「@executable_path /../框架」額外「的框架搜索路徑」

當我選擇運行,我得到的構建過程中以下警告:

構建目標TestApp

Ld的/Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app/Contents/MacOS/TestApp正常x86_64的 坎德拉/用戶/ meryn /工作/測試應用程式內/ TestApp setenv MACOSX_DEPLO YMENT_TARGET 10.8 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch x86_64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs /MacOSX10.8.sdk -L /用戶/ meryn /庫/開發商/ Xcode中/ DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz /編譯/產品/調試-F /用戶/ meryn /庫/開發商/ Xcode中/ DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz /編譯/產品/調試-F /用戶/ meryn /工作/測試應用程序/ TestApp 「-F @ executable_path /../框架」 -filelist /用戶/ meryn /庫/開發商/ Xcode中/ DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz /編譯/中間體/ TestApp.build /調試/ TestApp.build /對象 - 正常/ x86_64的/ TestApp.LinkFileList -mmacosx版本分鐘= 10.8 -fobjc弧-fobjc鏈路的運行時-framework可可-framework測試-o /用戶/ meryn /庫/開發商/ Xcode中/ DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz /編譯/產品/調試/ TestApp。應用/內容/ MacOS的/ TestApp

LD:警告:未找到選項目錄 '-F @ executable_path /../框架'

我能想象這個警告是可以預期的,因爲Id可根本不知道「@executable_path」。它是否正確?

隨後,運行應用程序失敗:

使dyld:庫未加載:@是rpath/Test.framework /版本/ A /從參照測驗 :/用戶/ meryn /庫/開發/的Xcode /DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app/Contents/MacOS/TestApp 原因:沒有找到圖片

奇特的事情是TestApp.app包確實包含一個框架目錄,與Test.framework目錄裏面。鑑於我對OS X如何搜索依賴關係的理解,我認爲我添加的搜索路徑應該可以很好地解決。

這是在XCode 4.6,OS X 10.8上。

otool -L TestApp給出

TestApp:

/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa(兼容版本1.0.0,當前版本19.0.0)

@ rpath的/ Test.framework /版本/ A /測試(兼容版本1.0.0,當前版本1.0.0)

/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation(compatib ility版本300.0.0,當前版本945.11.0)

/usr/lib/libobjc.A.dylib(兼容版本1.0.0,當前版本228.0.0)

/usr/lib中/ libSystem中。 B.dylib(compatible version 1.0.0,current version 169.3.0)

/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit(compatibility version 45.0.0,current version 1187.33.0)

可以在這裏看到「@rpath」未擴展嗎?

我在做什麼錯?

+0

因此,您是否將框架添加到了複製階段,因此它在運行時存在於軟件包內部,它位於目標應用程序內部,該目標應用程序位於派生數據文件夾中?我懷疑你添加的框架文件有問題。嘗試刪除它並將其重新添加到項目中。 – 2013-02-17 20:04:32

+0

那麼,在/Users/meryn/Library/Developer/Xcode/DerivedData/TestApp-ajwvknoonliuqqfaqxacxrmapyfz/Build/Products/Debug/TestApp.app(建立的東西)我有內容/框架/ Test.framework,其中包括符號鏈接到「測試」二進制文件等等。我不確定你的意思是「捆綁」。捆綁相當於應用程序「文件夾」?在Finder中它顯示「顯示包裝內容」,所以我認爲它被稱爲包裝。無論如何,我會嘗試重新添加。誰知道。 :) – 2013-02-17 21:16:24

+0

沒有快樂。還有其他的事情我可以看看嗎?我不介意在此期間學習一些有關OS X(也就是它的開發基礎設施)的知識。例如,有沒有辦法檢查「未找到圖像」是否意味着「無法找到文件」或者文件是否已損壞?我可以手動運行dyld,將它應用到構建的應用程序「包」(或其中的應用程序二進制文件)? – 2013-02-17 21:36:06

回答

9

由於庫標識符被設置到一個@rpath -prefixed路徑,連接到庫中的應用程序需要以指定的一個或多個選項-rpath指示什麼dyld應該替代品具有在運行時庫搜索時@rpath變量。如果您將框架複製到TestApp.app/Contents/Frameworks,則典型值爲@loader_path/../Frameworks。您可以使用TestApp目標上的Xcode中的LD_RUNPATH_SEARCH_PATHS('Runpath Search Paths')配置設置來設置-rpath參數的值。

我可以想象這個警告是可以預料的,因爲Ld可能根本不知道「@executable_path」。它是否正確?

@executable_path/../Frameworks添加到Xcode的框架搜索路徑是沒有用的。框架搜索路徑是靜態鏈接器的構建時概念(ld),而@executable_path變量是動態鏈接器(dyld)的運行時概念。

+1

哇,非常感謝。就是這樣!我不知道我需要使用「運行路徑搜索路徑」(在「鏈接」下)而不是「框架搜索路徑」(在「搜索路徑」下)。對不起,這麼晚回覆。我不知何故退出,所以我錯過了通知,也沒有收到電子郵件通知。 – 2013-03-18 16:42:31

+0

我想在當前的xcode中執行一箇舊的應用程序,並開始討厭rpath錯誤。我嘗試了一切,但無法修復。這就是我得到的:dyld:Library未加載:@ rpath/Sparkle.framework/Versions/A/Sparkle。我很欣賞光棚。 – 2015-04-07 20:19:37

相關問題