Ошибка "плохой коден, указатель diff в boost" ошибка в 32-битной сборке - PullRequest
5 голосов
/ 22 мая 2011

Под Mac OS X 10.6 я создаю разделяемую библиотеку C ++, которая ссылается на повышение 1.46.Я использую инструменты командной строки, установленные с Xcode 4.0.

64-битная сборка работает нормально.При сборке для 32-битной системы я получаю следующее сообщение об ошибке при линковке:

ld: bad codegen, pointer diff in boost::detail::sp_counted_base::sp_counted_base()to global weak symbol vtable for boost::detail::sp_counted_basefor architecture i386

Единственный найденный мной обходной путь - использовать g ++ - 4.0 для 32-битной сборки.Другие компиляторы, которые я пробовал (g ++ - 4.2, llvm-g ++ - 4.2 и clang ++), все выдают ошибку выше.

Ответы [ 5 ]

5 голосов
/ 11 июня 2011

Скорее всего, проблема в том, что вы статически связываете вместе две библиотеки с разными значениями для видимости по умолчанию (-fvisibility).Вы можете убедиться, что используете одинаковые флаги видимости для boost и вашего проекта, или используйте явный файл символов экспорта.

2 голосов
/ 13 января 2012

Для информации: В XCode видимость задается в Генерация кода> Встроенный метод скрыт и символы скрыты по умолчанию

Установка значения NO для решения этой проблемы.

Это соответствует в действии флагам gcc -fvisibility-inlines-hidden и -fvisibility. Вы можете использовать их только для настройки вашего кода вместо того, чтобы возиться с надстройкой.

2 голосов
/ 30 мая 2011

вы, вероятно, связываете библиотеку, созданную с помощью gcc 4.0, которая имеет несовместимый ABI с gcc 4.2 и clang.Вы должны перестроить все библиотеки, используемые с gcc4.2 или clang, используя те же параметры компилятора, что и ваше основное приложение (особое примечание к параметру «Стандартный тип библиотеки C ++», иначе STANDARD_C_PLUS_PLUS_LIBRARY_TYPE, который должен быть установлен как «статический» или «динамический» последовательно во всехбиблиотеки).Другой полезный параметр - это «символы, скрытые по умолчанию», но имейте в виду, что его включение может скрыть неприятные ошибки, которые могут возникнуть, если вы передадите объекты C ++ между библиотеками, скомпилированными с различными опциями / компиляторами.

1 голос
/ 09 августа 2012

Как сказано здесь :

Если повышение включено несколькими проектами, каждый проект должен иметь одинаковые значения для

 Symbols Hidden by Default
 Inline Methods Hidden
1 голос
/ 31 октября 2011

Проблема, похоже, исправлена ​​в компоновщике, установленном с XCode 4.2.При связывании теперь я получаю предупреждение вместо сообщения об ошибке:

ld: warning: direct access in __ZN5boost6detail15sp_counted_baseC2Ev to global weak symbol __ZTVN5boost6detail15sp_counted_baseE means the weak symbol cannot be overridden at runtime. This was likely caused by different translation units being compiled with different visibility settings.
...