2

次のような内容の「.h」ファイルがあります。

#ifndef MY_IMPORT
    #define MY_IMPORT __declspec(dllimport) /* !!! */
#endif

#ifndef MY_EXPORT
    #define MY_EXPORT __declspec(dllexport)
#endif

#ifdef __cplusplus
    extern "C"{
#endif

MY_IMPORT VOID* WINAPI XXX_FUNC( VOID * ARG1, ... );

/* ... */

#ifdef __cplusplus
}
#endif

@NサフィックスなしでXXX_FUNCをエクスポートする「lib.dll」ライブラリがあります。

この lib.dll を使用する dll (mydll.dll) をビルドしようとすると、GCC メッセージが表示されます。

undefined reference to `__imp__XXX_FUNC@12'

スタックオーバーフローを含む多くのインターネットを見ましたが、解決策が見つかりません。次のように呼び出されるリンカー:

g++ -shared -Wl,--enable-stdcall-fixup mydll.o -L. lib.dll -o mydll.dll 

私が見つけることができるように、GCC は '_ imp _XXX_FUNC@12' を '_ imp _XXX_FUNC' にリンクしようとする必要があり、'--enable-stdcall-fixup' はそのような条件での警告を防ぐ唯一のオプションですが、私の MinGW GCCこれを試さないでください。

GCC v4.7 で MinGW をインストールしました。

4

1 に答える 1

0

declspec(dllexport)dll をアクティブにコンパイルする必要があります。と を次のように置き換える必要がMY_IMPORTありMY_EXPORTます。

#ifdef _DLLifdef BUILDING_MY_DLL
# define MY_API __declspec(dllexport)
#else
# define MY_API __declspec(dllimport)
#endif

静的にビルドするときは、

#define MY_API

それをどのように判断するかは、あなたとあなたのビルドシステム次第です。私はそれを行うさまざまな方法を見てきました。次に、MY_APIエクスポートする各シンボルに追加します。

MY_IMPORT VOID* WINAPI XXX_FUNC( VOID * ARG1, ... );

これにより、DLL にシンボルが含まれるようになります。

__imp_XXX_FUNC...

他のものと。__imp_のために追加された に注意してくださいdllexport

はい、これは古風です (たとえば、GCC のvisibility属性を参照)。しかし、これが Windows のしくみです。

于 2013-05-12T10:49:03.387 に答える