Ошибки компоновщика Xcode 3.2.6 и 4 ld: неверный кодоген, указатель diff в ... на глобальный слабый символ - PullRequest
3 голосов
/ 18 марта 2011

У меня очень странные ошибки с Xcode 3.2.6 и Xcode 4.

Xcode 3.2.5 не содержит ошибок в моем проекте.

Символ, скрытый по умолчанию, установлен наДА.

Эти ошибки ссылок связаны со статическими членами (указателями) внутри шаблонных классов.Любые идеи, ключи компилятора / компоновщика для проверки, что-нибудь?

Ответы [ 2 ]

2 голосов
/ 08 июля 2011

Это связано с видимостью символов в скомпилированных вами библиотеках.Параметр GCC 4.0 -fvisibility = hidden предназначен для скрытия символов для библиотек DSO / общих объектов, чтобы сократить время соединения / загрузки.Тем не менее, я видел некоторые блоги онлайн, использующие этот переключатель каким-то своеобразным образом при компиляции статических библиотек.На самом деле я не смог выяснить, каков эффект или цель этого.Насколько мне известно, статические библиотеки нуждаются в информации о символах для функций, которые вы собираетесь использовать извне.

Я столкнулся с той же ошибкой компоновщика с boost :: exceptions.Однако, чтобы перехватить исключения определенного типа, GCC требует информацию о типе, но это проблема времени выполнения.Таким образом, даже если он правильно компилируется / связывается, сокрытие информации о символах в ваших проектах является , а не правильным решением, если вы собираетесь перехватить исключение из-за пределов библиотеки.См. Документацию Apple:

Если ваш символ использует информацию идентификации типов времени выполнения (RTTI), исключения или динамическое приведение для объекта, определенного в другой библиотеке, ваш символ должен быть видимым, если он ожидает обработкизапросы, инициированные другой библиотекой.Например, если вы определяете обработчик перехвата для типа в стандартной библиотеке C ++ и хотите перехватывать исключения этого типа, генерируемые стандартной библиотекой C ++, вы должны убедиться, что ваш объект typeinfo видим.

Источник: http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html

Мне действительно нужно было изменить заголовок исключения с помощью макросов, описанных здесь, чтобы мой проект компилировался и связывался: http://gcc.gnu.org/wiki/Visibility. Этобыл необходим даже с -fvisibility = default, что заставляет меня поверить, что это была какая-то ошибка компоновщика.

Тем не менее, я зарегистрировал ошибку против Boost здесь: https://svn.boost.org/trac/boost/ticket/4594#comment:11

Вы можете найти мойКонфигурация здесь: http://lists.boost.org/boost-users/2011/07/69251.php

1 голос
/ 25 марта 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...