![](/img/trans.png)
[英]Static library(ARC) work on non ARC app, met error: dyld: lazy symbol binding failed: Symbol not found: _objc_retainAutoreleasedReturnValue
[英]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)
如果我在上面標記為1
或2
的行中注釋掉了,或者將構建設置“啟用與共享庫的鏈接”更改為“是”,則錯誤消失了。 (但是,如果更改構建設置,則會收到多個ld warning: unexpected srelocation type 9
將庫鏈接到最終項目時ld warning: unexpected srelocation type 9
警告,並且在設備上運行時應用程序崩潰。)從test
刪除析構函數。
所以:這是Clang中的錯誤嗎? 我是否缺少一些非常重要且未記錄的構建設置? 至少可以說,外部提供的函數與帶有析構函數的結構之間的交互非常特殊。
經過大量搜索之后,我終於偶然發現了Richard Lord 在AIR本機擴展上的出色博客文章 。 事實證明,有效的開發需要使用Adobe尚未打擾的一些標志(除非您將開發人員博客文章視為文檔,但我不認為)。
長話短說:
-platformsdk
選項指向Apple提供的iOS SDK(例如: -platformsdk /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk
)。 這將緩解unexpected srelocation type 9
警告。 Adobe的文檔指出-platformsdk僅適用於Android,但這是一個謊言。 -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.