Возможно, вы используете библиотеку со скрытой информацией о символах. Если символ не был экспортирован из вашей библиотеки, и вы пытаетесь использовать его извне, это приводит к аналогичной ошибке компоновщика. Казалось бы, правильное решение состоит в том, чтобы найти способ сделать этот символ «видимым» для внешнего мира через определения макросов GCC и / или изменить саму библиотеку, чтобы убедиться, что этот конкретный символ действительно «скрыт» от внешнего мира - -ie это не то, что когда-либо использовалось или отображалось в заголовочном файле.
Однако, будьте осторожны: в соответствии с документацией Apple, вам не следует прятать некоторую символьную информацию по ряду причин; этот, перечисленный ниже, кажется самым тревожным из всех:
Если ваш символ использует информацию идентификации типа времени выполнения (RTTI), исключения или динамическое приведение для объекта, определенного в другой библиотеке, ваш символ должен быть видимым, если он ожидает обработки запросов, инициированных другой библиотекой. Например, если вы определяете обработчик перехвата для типа в стандартной библиотеке C ++ и хотите перехватывать исключения этого типа, генерируемые стандартной библиотекой C ++, вы должны убедиться, что ваш объект typeinfo видим.
Источник: http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html
Таким образом, если вы хотите поймать исключение из библиотеки, с которой вы ссылаетесь, скрытие информации о символах представляется плохим выбором. Правильным решением было бы показать символы любой библиотеки, на которую вы ссылаетесь. Это можно сделать с помощью , пропустив следующие флаги компилятора GCC:
-fvisibility=hidden --fvisibility-inlines-hidden
(видимости по умолчанию должно быть достаточно), или есть также прагмы компилятора, которые позволяют вам сделать это. Смотри: http://gcc.gnu.org/wiki/Visibility