0

我在第 3 方静态链接库上运行它。我认为由于它是一个仅标头库(某些 MSVC 版本除外),它不会出现。也许我误解了 nm 应该显示的内容。我真正想知道的是,如果我链接到使用不同版本的 Boost 编译的库,它们是否会导致 ODR 违规。

见输出:http ://codepad.org/kJ86hiQg

一个简短的抽样:

    W boost::exception_detail::clone_base::~clone_base()
    W boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >::~clone_impl()
    W boost::exception_detail::cloning_base::~cloning_base()
    W boost::exception_detail::counted_base::~counted_base()
    W boost::exception::~exception()
4

1 回答 1

1

这些似乎是弱符号。

http://en.wikipedia.org/wiki/Weak_symbol


更新ODR 违规首先不是由重复的链接器记录引起的。它们是编译器使用相同名称的不同符号定义时引起的。

因此,简短的回答是: nm显示这些弱符号不会导致或表明 ODR 违规。然而,这些符号很弱的事实并不意味着也不可能存在 ODR 违规。

事实上,我认为完全有可能在没有此类符号的情况下出现 ODR 违规(例如,当具有相同名称的结构的布局由于不同的对齐或打包选项而不同时)跨翻译单元。

于 2014-11-18T22:43:49.247 回答