私の実際のテストに関する限り、静的ライブラリ ( .lib
) をVisual-C++ の実行可能ファイルにリンクするときに、実行可能 .obj ファイルが静的ライブラリ内のシンボルと重複するシンボルを定義している場合、静的ライブラリ内のシンボルは黙って無視されます。 .
確認 (10 年 2 月 18 日 17:46 マイケル バー) :
MSVC は、シンボルが .obj ファイルと .lib で定義されている場合、警告なしに .obj ファイルのシンボルを使用するように動作していました。シンボルが複数のライブラリで定義されている状況も処理し、リストの最初に名前が付けられたライブラリのライブラリを使用することを思い出します。
しばらくこれを試したとは言えませんが、この動作が変更された場合は驚くでしょう (特に、.obj で定義されたシンボルが .lib ファイルのシンボルをオーバーライドします)。
VS 2010 RC で簡単なテストを行ったところ、説明した動作がまだ残っていることがわかりました。
( 「Windows Static Library with Default Functions」も確認のようです)
まず第一に、私が間違っていることを証明したいと思いますが、少なくとも通常の C++ 関数については、これがそうであるように思われます。
第二に、これを防ぐ方法はありますか?私は、この関数を含む静的ライブラリにバイナリリンクするときに、静的ライブラリのバージョンが実際に使用されていることを確認したいという関数を持っています。他のプロジェクトの残り物などではありません。(注: 問題の Fn はtest_suite* init_unit_test_suite(int argc, char* argv[])
, (*) であり、サードパーティのライブラリからのものであるため、実際には変更できません。)
(*):これは、私たちのカスタム静的ライブラリによって提供される Boost.Test メイン関数です。開発者が単体テスト プロジェクト (プロパティ シートを介して自動的に静的ライブラリにリンクされる) を作成するが、誤って関数も定義する場合、開発者が提供する関数を使用する代わりに、ビルドが中断する必要があります。