3

私の実際のテストに関する限り、静的ライブラリ ( .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 メイン関数です。開発者が単体テスト プロジェクト (プロパティ シートを介して自動的に静的ライブラリにリンクされる) を作成するが、誤って関数も定義する場合、開発者が提供する関数を使用する代わりに、ビルドが中断する必要があります。

4

1 に答える 1

0

静的ライブラリにパッケージ化されていない独立した obj ファイルに対してリンクすると、リンカーの動作が異なると思います。少なくとも、シンボルの重複に関する警告/エラーが発生するはずです。

少し前に似たようなものが必要になったとき、私も MS ツールチェーンでそれを見つけることができませんでしたが、2 つの MS デバイスが近くにあり、便利かもしれません: __declspec(selectany)と文書化されていない#pragma /alternatenameです。おそらく、obj ファイルにリンクし、シンボルを selectany として宣言するとうまくいくでしょうか? そうでない場合は、おそらく exe-obj ファイルに #pragma comment(linker, "/alternatename:_YourSymbol=_DefaultExeSymbol") を追加することで実行できます。

于 2014-11-05T10:35:58.130 に答える