0

xh ファイルと yh ファイル、zc ファイルがあります。zc には yh が含まれ、yh には xh が含まれます。yh で他の関数を使用する必要があるため、xh で宣言し、zc で定義する必要がある関数があります。

私はこのようにしてみました

// x.h
int foo();

// y.h
#include "x.h"

// z.c
#include"y.h"
int foo() {
   blah;
   blah;
   return 1;
}

これはすべて1つのプロジェクトに含まれており、x_y.dllで言えば、うまくコンパイルされ、x_y.dll、x_y.libがあります

現在、ac ファイルの 1 つの別のプロジェクト a_b で、xh をインクルードして foo(); を呼び出そうとしています。正常にコンパイルされますが、リンカ エラー lnk2019 および lnk1120 未解決の外部シンボルが発生しています。

私は VS2008 で作業しています。x_y.lib があるフォルダーへのパスが設定されています。

4

1 に答える 1

0

次のようなマクロを作成します。

#ifndef DLL_IFACE
#ifdef DLL_IFACE_EXPORT
#define DLL_IFACE _declspec( dllexport )
#else  // !DLL_IFACE_EXPORT
#define DLL_IFACE _declspec( dllimport )
#endif // !DLL_IFACE_EXPORT
#endif // !DLL_IFACE

そして、これを全員が含むヘッダーに入れます。次にxhで:

DLL_IFACE int foo();

次にzcで、そのファイルを次のように開始します。

#define DLL_IFACE_EXPORT

これにより、関数を定義する dll をビルドするときに、関数が "_declspec( dllexport )" として宣言されます。また、関数が他の dll で "_declspec( dllimport )" と宣言されるようになります。

dllexport は、指定された関数が dll のパブリック インターフェイスの一部であるべきであることをコンパイラに伝えます。関数を dll の動的シンボル テーブルに配置します。dllimport は、関数が後で動的リンクによってインポートされることをコンパイラに伝えます。

于 2012-07-11T00:50:48.840 に答える