我已经在dll类型的Visual Studio中创建了示例C ++项目。它包含头文件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();


在SqlLtDb.cpp中,方法实现如下(我仅显示了两种实现):

...

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文件由LIB命令使用上面的.def文件生成。
这是我的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文件夹中。然后我将SqlLtDb.h文件添加到存储consoleApplication的源文件的文件夹中。

consoleApplication中的函数main如下所示:

#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成功导出,但是问题出在类的导出方法上。我不会导出所有类,更好的是导出指向类的指针。

谢谢

最佳答案

您需要使用__declspec(dllexport)导出DLL中的类,并使用__declspec(dllimport)将其导入链接代码中。例:

class SQLLTDB_API CSqlLtDb {
    ...
};


您不需要每个成员都使用SQLLTDB_API,仅需要类-链接器将为您为每个方法生成导出。

09-06 12:00