私は現在、インターネット上の多くの場所で言及されているストアド プロシージャを使用して、DLL とそれに付随するクライアントを作成しています。基本的に、Project.h ファイルで PROJECT_EXPORTS を実際に定義する DLL プロジェクトを作成します。
このようなもの:
// Assume the name of the project is SanProj and the header file is SanProj.h
#ifdef SANPROJ_EXPORTS
#define SANPROJ_API __declspec(dllexport)
#else
#define SANPROJ_API __declspec(dllimport)
#endif
現在、このヘッダーを使用する通常の方法は、API クラスのすべてのヘッダーにこれを含め、DLL 内の場合は「エクスポート」宣言に、クライアントとして使用する場合は「インポート」宣言に SANPROJ_EXPORTS を使用することです。たとえば、通貨クラスを持つヘッダー ファイルがあるとします。
// currency.hpp
#include "SanProj.h"
#include <ostream>
#include <string>
namespace SanProj {
class SANPROJ_API Currency {
public:
Currency();
const std::string& name();
const std::string& code();
bool empty() const;
protected:
std::string name_;
std::string code_;
};
SANPROJ_API bool operator==(const Currency&,
const Currency&);
SANPROJ_API bool operator!=(const Currency&,
const Currency&);
SANPROJ_API std::ostream& operator<<(std::ostream& out, Currency& c);
}
そして、特定の通貨を含む別のヘッダー ファイル:
// allccy.hpp
namespace SanProj {
class SANPROJ_API USDCurrency : public Currency {
public:
USDCurrency() {
name_ = "American Dollar";
code_ = "USD";
}
};
class SANPROJ_API CADCurrency : public Currency {
public:
CADCurrency() {
name_ = "Canadian Dollar";
code_ = "CAD";
}
};
}
上記のクラスは、DLL プロジェクトの契約を形成します。main
次に、関数を持つ単一のクラスであるクライアント プロジェクト ファイルを見てみましょう。
#include "currency.hpp"
#include "allccy.hpp"
#include <iostream>
using namespace SanProj;
int main(int argc, char* argv[])
{
USDCurrency uccy;
std::cout << uccy;
}
すべての参照/設定が Visual Studio プロジェクトで既に行われていると仮定すると、クライアントをコンパイルしようとすると次のエラーが発生します。
1>testdll.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall SanProj::USDCurrency::~USDCurrency(void)" (__imp_??1USDCurrency@SanProj@@QAE@XZ)
1>testdll.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall SanProj::USDCurrency::USDCurrency(void)" (__imp_??0USDCurrency@SanProj@@QAE@XZ)
驚くことではありませんが、ファイルdllimport
からその部分を削除しSanProj.h
て実行可能ファイルを作成すると、このエラーはなくなります。
dllimport
私の質問は、ヘッダーに対してクライアントをコンパイルできない場合、生成された IDE のポイントは何ですか? ヘッダーを引き続き使用し、リンカー エラーを削除する方法はdllimport
ありますか? dllexports
また、dllimport
LIB ファイルのシンボルを解決しようとするのはなぜですか?
TIA
/サスケ
編集: VisualStudio で使用されるリンカー コマンド。ご覧のとおり、LIB ファイルがあります。
/OUT:"E:\vsprojects\SomeSln\Release\testdll.exe" /INCREMENTAL:NO /NOLOGO "E:\vsprojects\SomeSln\Release\SanProj.lib" "kernel32.lib" "user32.lib" "gdi32. lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST / ManifestFile:"Release\testdll.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"E:\vsprojects\SomeSln\Release\testdll.pdb" / SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"E:\vsprojects\SomeSln\Release\testdll.pgd" /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE