编译使用Boost的iOS应用程序时,可见性链接器警告

时间:2013-10-04 20:43:33

标签: ios xcode boost linker clang

我的iOS应用程序使用的库依赖于Boost。在修改第三方构建系统时,我遇到了链接器警告,例如此

ld: warning: direct access in ___cxx_global_var_init to global weak symbol
std::__1::basic_ofstream<char, std::__1::char_traits<char> >::~basic_ofstream()
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 __GLOBAL__I_a to global weak symbol
boost::exception_ptr::~exception_ptr()
means the weak symbol cannot be overridden at runtime.
This was likely caused by different translation units being compiled with different visibility settings.

我看到关于此警告的SO还有其他一些问题。我按照他们的建议确保所有版本中的可见性设置相同(-fvisibility=hidden-fvisibility-inlines-hidden)。完全重建后,我仍然收到警告。

环境:

  • Xcode 4.6.0
  • iOS SDK 6.1
  • 使用流行的galbraithjosephs-boostoniphone构建脚本的修改克隆构建Boost
  • Boost版本1.54.0
  • 使用-std=c++11 -stdlib=libc++
  • 构建

1 个答案:

答案 0 :(得分:5)

问题是Boost构建脚本使用clang++作为编译器,但是另一个库和我自己的iOS应用程序使用了clang(另一个库和我的应用程序是Xcode项目,其中构建了与clang)。

使用clang重建Boost后,警告消失了。

令人遗憾的是,我不知道为什么这会有所帮助。我知道用clang++进行编译会将编译器切换到C ++模式,打开/关闭某些设置。但它肯定不能意味着使用clang++覆盖命令行中显式指定的可见性设置?!欢迎提供解释此行为的评论或其他答案。