2012-12-28 70 views
0

我得到這個錯誤爲我的項目之一使用靜態庫。該項目在iOS設備上運行良好。但不是在模擬器中。靜態庫不是我的,所以我不能爲i386重新編譯它。 但這是iPhone的硬件驅動程序。所以在模擬器中運行時我真的不需要這個庫。就好像附件與設備一起存在,那麼應用程序將具有不同的流程。iphone缺少必需的體系結構i386

所以我必須保持對這個文件的引用。但只會在iOS設備上需要。在模擬器中運行應用程序以用於UI和其他測試目的時不需要。

我該如何避免這個錯誤?無論如何要配置目標或方案以避免在模擬器中運行時的目標文件/ lib?

ld: warning: ignoring file 
/Framework/iSmartSDK/libiSmartSDK_Lib.a, missing required architecture i386 in file 
/Framework/iSmartSDK/libiSmartSDK_Lib.a (2 slices) 
Undefined symbols for architecture i386: 
    "_OBJC_CLASS_$_iSmart", referenced from: 
     objc-class-ref in SmartCardReaderVC.o 
ld: symbol(s) not found for architecture i386 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

回答

1

當您使用它時,符號IS被引用並且需要lib。如果您真的不需要這些功能,請將其用途包含在定義中。 '定義出來':

#if TARGET_OS_IPHONE 
    iSmart *smart = .... 
#else 
    NSLog(@"no ismart on mac"); 
#endif 

注意:僅分配/調用符號是不夠的。甚至不使用符號來聲明一個變量**


它可能只是在1個文件AFAICS ..的#ifdef整個文件,也許創造SmartReaderVC存根

+0

然後,我必須有很多定義#在我的代碼會讓它變得凌亂。有沒有其他方式像聲明一個'弱'引用類型或'可選'庫? – karim

+0

IIRC不適用於靜態庫,否。爲動態庫和框架,但不是.a文件 –

+0

其唯一在1文件AFAICS .. #ifdef整個文件,也許創建一個SmartReaderVC存根 –

1

即使你說你不在模擬器中不需要圖書館,鏈接器說別的。它正在尋找類iSmart

前進的最佳方式可能是寫一個存根類iSmart

  • 創建一個靜態庫項目。

  • 添加非常非常小的類iSmart,例如,類和兩種方法。每種方法不做任何處理或返回0.

  • 構建模擬器(i386)的庫。

  • 使用lipo工具將來自第三方的存儲庫和存根庫的i386部分合併到單個庫中(導致設備的大部分和模擬器的最小部分)。

  • 將您的應用程序鏈接到自定義庫而不是原始庫。

+0

看起來很有趣:) – karim

+0

恕我直言,這是太多的努力:D-最乾淨的解決方案雖然 –

相關問題