Странные предупреждения от компоновщика (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.
Обратите внимание:
Ответы
Ответ 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
Я установил все вложения, скрытые в нет, и предупреждение (наконец) ушло.