簡體   English   中英

iPhone靜態庫Clang / LLVM錯誤:non_lazy_symbol_pointers

[英]iPhone static library Clang/LLVM error: non_lazy_symbol_pointers

經過幾個小時的試驗,我設法將問題簡化為以下示例(C ++):

extern "C" void foo();

struct test
{
    ~test() { }
};

void doTest()
{
    test t; // 1
    foo();  // 2
}

正在使用提供的Clang編譯器(Apple LLVM編譯器3.0)和iOS 5.0 SDK在XCode 4.2中為iOS設備編譯此文件。 該項目配置為Cocoa Touch靜態庫,並且“啟用與共享庫的鏈接”設置為“否”,因為我正在構建AIR本機擴展。 函數foo在另一個外部庫中定義。 (在我的實際項目中,這將是Adobe定義用於AIR本機擴展的任何C API函數。)

嘗試編譯此代碼時,我得到了以下錯誤:

FATAL:incompatible feature used: section type non_lazy_symbol_pointers (must specify "-dynamic" to be used)
clang: error: assembler command failed with exit code 1 (use -v to see invocation)

如果我在上面標記為12的行中注釋掉了,或者將構建設置“啟用與共享庫的鏈接”更改為“是”,則錯誤消失了。 (但是,如果更改構建設置,則會收到多個ld warning: unexpected srelocation type 9將庫鏈接到最終項目時ld warning: unexpected srelocation type 9警告,並且在設備上運行時應用程序崩潰。)從test刪除析構函數。

所以:這是Clang中的錯誤嗎? 我是否缺少一些非常重要且未記錄的構建設置? 至少可以說,外部提供的函數與帶有析構函數的結構之間的交互非常特殊。

經過大量搜索之后,我終於偶然發現了Richard Lord 在AIR本機擴展上出色博客文章 事實證明,有效的開發需要使用Adobe尚未打擾的一些標志(除非您將開發人員博客文章視為文檔,但我不認為)。

長話短說:

  • 將“啟用與共享庫的鏈接”設置為“是”。 將此設置為No是關於開發AIR本機擴展的最普遍的壞建議。
  • 使用ADT的-platformsdk選項指向Apple提供的iOS SDK(例如: -platformsdk /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk )。 這將緩解unexpected srelocation type 9警告。 Adobe的文檔指出-platformsdk僅適用於Android,但這是一個謊言。
  • 在打包擴展名時(即,在構建ANE文件時),請使用未-platformoptions說明的-platformoptions選項指定包含其他鏈接器參數的xml文件。 該XML文件的格式也未記錄,但是可以在AIR SDK目錄中的templates/extensions/ios/platform-descriptor-template.xml下找到一個templates/extensions/ios/platform-descriptor-template.xml 在同一位置也有一個xsd模式。 該文件允許您指定擴展使用的其他框架,因此您將不僅限於AIR SDK支持的默認框架。
  • 期望看到一個新的鏈接器警告: ld: warning: ARM function not 4-byte aligned 這顯然可以安全地忽略。 據報道,Adobe已意識到該問題。 我想您可以通過將-w傳遞給platformoptions文件中的鏈接器來使該警告靜音,但是請注意-w使所有警告而不是僅使所有警告靜音。

可以在Adobe工程師之一Rajorshi Ghosh的這兩個博客文章中找到更多信息:

這仍然不能解釋“啟用與共享庫的鏈接”,外部定義的函數和析構函數之間的怪異互動,但是現在這只是出於好奇而不是阻塞性問題。

暫無
暫無

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

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