後幾個小時的實驗,我已經成功地減少的問題,以下面的例子中(C++):iPhone靜態庫鏘/ LLVM錯誤:non_lazy_symbol_pointers
extern "C" void foo();
struct test
{
~test() { }
};
void doTest()
{
test t; // 1
foo(); // 2
}
這被編譯爲在XCode中iOS設備4.2,使用提供的Clang編譯器(Apple LLVM編譯器3.0)和iOS 5.0 SDK。該項目配置爲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
警告,並且在設備上運行時應用程序會崩潰。)如果從test
刪除析構函數,構建錯誤也會消失。
所以:這是叮噹中的錯誤嗎?我是否錯過了一些非常重要且沒有記錄的構建設置?至少可以說,外部提供的函數和具有析構函數的結構之間的交互是非常奇特的。
我在非AIR情況下遇到了同樣的問題。主要問題是你的第一個項目符號和設置,共享鏈接到是解決了問題。 – 2012-03-28 04:35:45