来自链接器的奇怪警告(ld)

Ita*_*Ale 24 macos xcode ld

我们正在构建一个主要使用Obj-C/Cocoa编写的Mac OSX应用程序.然后,应用程序静态链接一些第三方库,用C/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.
Run Code Online (Sandbox Code Playgroud)

这来自C/C++库.我们正在与这些库链接:

  1. libphonenumber,显然是5个警告中的4个.由我们通过"cmake"编译.
  2. boost(libboost_thread-mt),负责1个警告.使用MacPorts编译.
  3. ICU(libicudata,libicuuc,libicui18n),使用MacPorts编译.
  4. 协议缓冲区,通过"./configure && make"编译.

请注意:

  1. 尽管有警告,应用程序仍然完美运行,但我们想摆脱它们,因为它们很烦人.
  2. xcode提出的解决方案使用boost:链接器(Id)关于可见性设置的警告不起作用:"默认情况下隐藏的符号"始终为"YES".

ins*_*r-g 23

xcode提出的解决方案使用boost:链接器(Id)关于可见性设置的警告不起作用:"默认情况下隐藏的符号"始终为"YES".

这与设置为"YES"的关系较少,更多的是与在所有项目中设置为相同的值有关.依赖于其他库的库/项目需要具有"默认隐藏的符号"的类似设置,以便正确链接并且没有错误/警告.

我之前遇到过这种情况,并且对所有项目进行Xcode的简单更改以确保设置匹配通常可以解决问题.既然听起来你也在编译命令行,那么你需要注意的是-fvisibility参数gcc.

  • 是的,如果您使用 gcc 编译它们,那就是我要开始的地方。添加 `-fvisibility=default` 将使所有符号“公开”。当然,您项目的最终正确选择取决于您的需求,因此我会通过在终端中运行“man gcc”或通过 Google 搜索来阅读有关“-fvisibility”的文档。但是,正如我提到的,确保所有项目使用相同的“-fvisibility”设置通常可以解决这个问题。从“默认”(本质上是“公共”)开始。 (2认同)

joh*_*yrd 7

TL:博士; -fvisibility=hidden在编译的所有内容中使用gcc和llvm编译器开关,包括依赖库,除非你有理由不这样做.

在撰写本文时,Apple网站上提供了对-fvisibility和-fvisibility-inline-hidden编译标志的良好介绍.本文还详细介绍了声明__attribute__((visibility("hidden")))__attribute__((visibility("default")))声明.


小智 6

通过放入-fvisibility=hidden -fvisibility-inlines-hiddenOTHER C++ FLAGS,我在 Xcode 中得到了警告。