Visual Studioでdll型のサンプルC++プロジェクトを作成しました。これは、ヘッダファイルSqlLtDb.hが含まれています。次のようにC++クラスのメソッドはdllからエクスポートしません(VS - win)
using namespace std;
// This class is exported from the SqlLtDb.dll
class CSqlLtDb {
public:
CSqlLtDb(char *fileName);
~CSqlLtDb();
// TODO: add your methods here.
bool SQLLTDB_API open(char* filename);
vector<vector<string>> SQLLTDB_API query(char* query);
bool SQLLTDB_API exec(const char* query);
void SQLLTDB_API close();
int SQLLTDB_API getNameOfClass();
private:
sqlite3 *database;
};
extern "C" SQLLTDB_API CSqlLtDb* getInstanceCSblLtDb();
extern SQLLTDB_API int nSqlLtDb;
extern "C" SQLLTDB_API int fnSqlLtDb();
そしてSqlLtDb.cpp方法では、(私は2つだけの実装を示しています)実装されています。このような
...
int SQLLTDB_API CSqlLtDb::getNameOfClass()
{
return 777;
}
extern "C" SQLLTDB_API CSqlLtDb* getInstanceCSblLtDb()
{
CSqlLtDb* instance = new CSqlLtDb("");
return instance;
}
SqlLtDb.defファイルを見て:
LIBRARY "SqlLtDb"
EXPORTS
getInstanceCSblLtDb
open
query
exec
close
getNameOfClass
上記の.defファイルを使用して、SqlLtDb.libファイルがLIBコマンドによって生成されます。 これは私のSqlLtDb.dllファイルです。
ここで、このファイルをconsoleApplicationアプリケーションに含めたいとします。 ConsoleApplicationがVS 2008にあります。 プロパティ - >構成プロパティ - >リンカ - >入力 - >追加の依存関係:SqlLtDb.lib; プロパティ - >構成プロパティ - >リンカ - >一般 - >追加ライブラリ ディレクトリ:E:\ PM \ SqlLtDb \ Release; ランタイムライブラリはそのままです:マルチスレッドデバッグDLL(/ MDd)(私はそれを変更しませんでした)。
私はファイルをコピーしました:SqlLtDb.dll、SqlLtDb.lib、SqlLtDb.def、sqlite3.dllをconsoleApplication.exeが生成されたDebugフォルダにコピーしました。そして、consoleApplicationのソースファイルが格納されているフォルダにSqlLtDb.hファイルを追加しました。 consoleApplicationで
機能の主は次のようになります。私はこのコードをコンパイルすると
#include "stdafx.h"
#include "SqlLtDb.h";
int _tmain(int argc, _TCHAR* argv[])
{
CSqlLtDb* mySqlClass = getInstanceCSblLtDb(); // here is ok, this method is
// exported rigth
mySqlClass->open(""); // here is error whit open method
return 0;
}
私はエラーを取得する:
Error 1 error LNK2019: unresolved external symbol "__declspec(dllimport) public:
bool __thiscall CSqlLtDb::open(char *)" ([email protected]@@[email protected])
referenced in function _wmain consoleApplication.obj consoleApplication
方法getInstanceCSblLtDbは、エクスポート成功しているが、問題は、クラスからのエクスポート方法であります。私はすべてのクラスをエクスポートすることはありません、より良いクラスへのエクスポートポインタです。あなたが__declspec(dllexport)
とDLL内のクラスをエクスポートし、__declspec(dllimport)
とリンクコードでそれをインポートする必要が
おかげ
私はそれを変更しましたが、結果は同じで未解決のシンボルがオープン – Robert
.defファイルを削除するとどうなりますか? __declspec(dllimport/dllexport)を使用するときは必要ありません。それは干渉している可能性があります...? –
これは両方の例で同じです:クラスのエクスポートとクラスのメンバーのエクスポート。私は何が間違っているのか分からない。 – Robert