2011-07-18 12 views
0

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)とリンクコードでそれをインポートする必要が

おかげ

答えて

1

。例:

class SQLLTDB_API CSqlLtDb { 
    ... 
}; 

あなただけのクラス、各メンバーのためSQLLTDB_APIを必要としない - リンカはあなたのための各メソッドの輸出を生成します。

+0

私はそれを変更しましたが、結果は同じで未解決のシンボルがオープン – Robert

+0

.defファイルを削除するとどうなりますか? __declspec(dllimport/dllexport)を使用するときは必要ありません。それは干渉している可能性があります...? –

+0

これは両方の例で同じです:クラスのエクスポートとクラスのメンバーのエクスポート。私は何が間違っているのか分からない。 – Robert

関連する問題