我已经在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,仅需要类-链接器将为您为每个方法生成导出。