web-dev-qa-db-ja.com

Visual StudioでのGCCスタイルの弱いリンク?

GCCには、__attribute__((weak))を介してシンボルリンクを弱くする機能があります。ユーザーがアプリケーションでオーバーライドできる静的ライブラリで弱いシンボルを使用したいと思います。 GCCスタイルの弱いシンボルでそれが可能になりますが、ビジュアルスタジオで実行できるかどうかはわかりません。

Visual Studioは同様の機能を提供しますか?

42
deft_code

MSVC++には、弱いシンボルの機能の一部をカバーする__declspec(selectany)があります。これにより、外部リンケージを使用して複数の同一のシンボルを定義し、使用可能ないくつかのいずれかを選択するようコンパイラーに指示できます。ただし、MSVC++には、弱いシンボル機能の他の部分をカバーするようなものはないと思います。つまり、ライブラリで「置き換え可能な」定義を提供する可能性があります。

これは、ところで、標準の交換可能な::operator newおよび::operator delete関数のサポートがMSVC++でどのように機能するのか不思議に思います。

17
AnT

あなたはそれを行うことができます、これはCの例です:

/*
 * pWeakValue MUST be an extern const variable, which will be aliased to
 * pDefaultWeakValue if no real user definition is present, thanks to the
 * alternatename directive.
 */

extern const char * pWeakValue;
extern const char * pDefaultWeakValue = NULL;

#pragma comment(linker, "/alternatename:_pWeakValue=_pDefaultWeakValue")
77
Ringo

MSVCは、シンボルが.objファイルと.libで定義されている場合、警告なしに.objファイルのシンボルを使用するように動作していました。シンボルが複数のライブラリで定義されている状況も処理し、リストの最初に名前が付けられたライブラリのシンボルを使用することを思い出します。

しばらくこれを試したとは言えませんが、この動作が変更された場合は驚きます(特に、.objで定義されたシンボルが.libファイルのシンボルをオーバーライドする)。

11
Michael Burr

私が知っている唯一の方法。各シンボルを別々のライブラリに配置します。オーバーライドのあるユーザーオブジェクトもライブラリに結合する必要があります。次に、すべてを一緒にアプリケーションにリンクします。ユーザーライブラリを入力ファイルとして指定する必要があります。ライブラリは、/DEFAULTLIB:オプションを使用してリンカーに転送する必要があります。

3
denis

この属性に相当するMS-VCはありません。 http://connect.Microsoft.com/VisualStudio/feedback/details/505028/add-weak-function-references-for-visual-c-c を参照してください。私は何か恐ろしいことを提案するつもりです:ここでその目的を読んでください: http://www.kolpackov.net/pipermail/notes/2004-March/000006.html それは本質的に関数を定義することですそれは、それらの記号が存在する場合は使用され、そうでない場合は使用されないため、...

「これを行う必要がある場合」という大きな警告とともに、この目的でプリプロセッサを使用してみませんか? (私はプリプロセッサを推奨するのが好きではありません)。

例:

#ifdef USE_MY_FUNCTION
     extern void function();
#endif

次に、#ifdefステートメントで囲まれたアプリケーションロジックで適切に呼び出します。静的ライブラリがリンクされている場合は、リンク処理の一環として、定義を微調整してUSE_MY_FUNCTIONを定義します。

直接同等ではなく、非常に醜いですが、私が考えることができる最高のものです。

3
user257111

これを行う1つの方法は、 LoadLibrary および GetProcAddress を介して手動で実装することです。

0
Mark Wilkins