0

これをサードパーティの静的にリンクされたライブラリで実行しています。ヘッダーのみのライブラリなので (一部の 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 に答える