Подтвердить что ты не робот

Странные предупреждения от компоновщика (ld)

Мы создаем приложение Mac OSX, которое написано в основном в Obj-C/Cocoa. Затем приложение статически связывается с некоторыми сторонними библиотеками, написанными на C/С++ и скомпилированными нами (в командной строке, используя либо MacPorts, либо обычный "./configure && make"; все это универсальные двоичные файлы).

Приложение работает отлично, но время компиляции объявлений всегда получает эти странные предупреждения компоновщика:

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

Это происходит из библиотеки C/С++. Мы связываемся с этими libs:

  • libphonenumber, который, по-видимому, вызывает 4 из 5 предупреждений. Составлено нами через "cmake".
  • boost (libboost_thread-mt), ответственный за 1 предупреждение. Скомпилирован с MacPorts.
  • ICU (libicudata, libicuuc, libicui18n), скомпилированный с помощью MacPorts.
  • Буферы протокола, скомпилированные с помощью.. /configure & make.

Обратите внимание:

4b9b3361

Ответ 1

Решение, предложенное xcode с boost: linker (Id) Предупреждение о настройки видимости не работают: "Символы, скрытые по умолчанию", всегда было "ДА".

Это меньше связано с установкой на "ДА" и больше связано с тем, что для всех проектов установлено одинаковое значение. Libs/projects, которые зависят от других libs, должны иметь аналогичную настройку для "Символы, скрытые по умолчанию", чтобы правильно связывать и не допускать ошибок/предупреждений.

Я столкнулся с этим раньше, и простое изменение Xcode для всех проектов, чтобы обеспечить соответствие параметров, как правило, устраняет проблему. Поскольку это похоже на компиляцию в командной строке, аргумент -fvisibility для gcc - это то, что вам нужно посмотреть.

Ответ 2

ТЛ: др; используйте -fvisibility=hidden как компилятор gcc и llvm во всех компиляциях, включая ваши зависимые библиотеки, если у вас нет причин для этого.

Хорошее введение в флаги -fvisibility и -fvisibility-inline-hidden флагов компиляции доступно на веб-сайте Apple на момент написания этой статьи. В статье также подробно рассматриваются объявления __attribute__((visibility("hidden"))) и __attribute__((visibility("default"))).

Ответ 3

Я получил предупреждение в Xcode, поместив -fvisibility=hidden -fvisibility-inlines-hidden в OTHER С++ FLAGS.

Ответ 4

Я также получил это по тем же причинам, но я думаю, что проблема заключалась в несогласованности настроек визуализации визуализации.

См. http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-December/046505.html

Я установил все вложения, скрытые в нет, и предупреждение (наконец) ушло.