0

C++Visual Studio で dll タイプのサンプル プロジェクトを作成しました。ヘッダーファイルが含まれていますSqlLtDb.h

 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();

inSqlLtDb.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

SqlLtDb.lib ファイルは、上記の .def ファイルを使用して、LIB コマンドによって生成されます。これは私の SqlLtDb.dll ファイルです。

ここで、このファイルを consoleApplication アプリケーションに含めたいと思います。ConsoleApplication は VS 2008 にあります。設定しました:

Properties->Configuration Properties->Linker->Input->Additional Dependencies : SqlLtDb.lib;

Properties->Configuration Properties->Linker->General->Additional Library Directories: E:\PM\SqlLtDb\Release;

ランタイム ライブラリは次のように設定されています: マルチスレッド デバッグ DLL (/MDd) (私は変更していません)。

ファイルをコピーしました:が生成さSqlLtDb.dll, SqlLtDb.lib, SqlLtDb.def, sqlite3.dllれる Debug フォルダーに。consoleApplication.exeそして、ソースファイルが保存されているSqlLtDb.hフォルダーにファイルを追加しました。consoleApplication's

関数 main は次の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 *)" (__imp_?open@CSqlLtDb@@QAE_NPAD@Z) 
referenced in function _wmain consoleApplication.obj consoleApplication

メソッドgetInstanceCSblLtDbは正常にエクスポートされましたが、問題はクラスからのエクスポート メソッドにあります。すべてのクラスをエクスポートするつもりはありません。クラスへのポインターをエクスポートすることをお勧めします。

ありがとう

4

1 に答える 1

1

を使用して DLL 内のクラスをエクスポートし__declspec(dllexport)、 を使用してリンク コードにインポートする必要があります__declspec(dllimport)。例:

class SQLLTDB_API CSqlLtDb {
    ...
};

各メンバーに SQLLTDB_API は必要ありません。クラスのみが必要です。リンカーは各メソッドのエクスポートを生成します。

于 2011-07-18T07:18:16.877 に答える