После нескольких часов экспериментов мне удалось свести проблему к следующему примеру (C ++):
extern "C" void foo();
struct test
{
~test() { }
};
void doTest()
{
test t; // 1
foo(); // 2
}
Это компилируется для устройств iOS в XCode 4.2 с использованием прилагаемого компилятора Clang.(Компилятор Apple LLVM 3.0) и iOS 5.0 SDK.Проект настроен как статическая библиотека Cocoa Touch, а для параметра «Включить связывание с общими библиотеками» задано значение «Нет», поскольку я создаю собственное расширение AIR.Функция foo
определена в другой внешней библиотеке.(В моем реальном проекте это была бы любая из функций C API, определенных Adobe для использования в собственных расширениях AIR.)
При попытке скомпилировать этот код я получаю сообщение об ошибке:
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
.
Итак: это ошибка в Clang?Я пропускаю некоторые важные и недокументированные настройки сборки?Взаимодействие между предоставляемой извне функцией и структурой с деструктором, по меньшей мере, очень своеобразно.