我的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
)。完全重建后,我仍然收到警告。
环境:
-std=c++11 -stdlib=libc++
答案 0 :(得分:5)
问题是Boost构建脚本使用clang++
作为编译器,但是另一个库和我自己的iOS应用程序使用了clang
(另一个库和我的应用程序是Xcode项目,其中构建了与clang
)。
使用clang
重建Boost后,警告消失了。
令人遗憾的是,我不知道为什么这会有所帮助。我知道用clang++
进行编译会将编译器切换到C ++模式,打开/关闭某些设置。但它肯定不能意味着使用clang++
覆盖命令行中显式指定的可见性设置?!欢迎提供解释此行为的评论或其他答案。