Ld warning: слишком много индивидуальных процедур для компактного разматывания для кодирования
У компоновщика для цели симулятора iOS я сообщаю следующее предупреждение:
ld: warning: too many personality routines for compact unwind to encode
Никакой номер строки не указан, ни что-либо еще, что может быть выполнено. Googling появился в некотором Apple с открытым исходным кодом, но я не понимаю его.
Что это значит и что я могу сделать для его решения?
Ответы
Ответ 1
Я нашел некоторую информацию в С++ ABI для документации Itanium, которая проливает свет на то, что это значит.
Индивидуальная подпрограмма - это функция в библиотеке времени выполнения С++ (или другого языка), которая служит в качестве интерфейса между библиотекой раскрутки системы и семантикой обработки исключений языка.
Экстраполяция, это предупреждение указывает, что у вас слишком много видов обработки исключений в одном двоичном файле, и по крайней мере один из них может выйти из строя. Действительно, это именно то, что наблюдается в этом вопросе.
К сожалению, нет четкого способа исправить это, только обходные пути. Вы можете подавить предупреждение, удалить код, переписать код на другом языке, отключить передачу исключений языка и, возможно, другие.
Ответ 2
Если у вас есть сбой при исключении с этим предупреждением, т.е. ::terminate()
вызывает каждый throw
, обходным путем является использование таблиц обработки исключений старого карлика. Добавьте следующие флаги в Настройки сборки/Связывание/Другие флаги компоновщика:
-Wl,-keep_dwarf_unwind -Wl,-no_compact_unwind
Ответ 3
Вы можете отключить предупреждение с помощью -Wl,-no_compact_unwind
для других флагов компоновщика. Я считаю это безобидным.
Ответ 4
Я столкнулся с этой проблемой и при попытке запустить на симуляторе iOS, пока мой код работал правильно на устройстве. В моем случае это было не предупреждение, а ошибка компоновщика.
К счастью, я вспомнил, что я добавил два флага для luajit для правильной работы в соответствии с инструкциями этой страницы в разделе раздел Вложение LuaJIT:
-pagezero_size 10000 -image_base 100000000
Я предполагаю, что адрес image_base просто выходит за пределы центрального процессора.
В любом случае удаление этих настроек заставило его работать в моей конфигурации.
Итак, перейдите к настройкам вашего проекта и найдите любые жесткие проводные значения такого типа, если они не совпадают.
Надеюсь, что это поможет,
M