我在C++
dll 类型的 Visual Studio 中创建了示例项目。它包含头文件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 中。我设置了:
Properties->Configuration Properties->Linker->Input->Additional Dependencies : SqlLtDb.lib;
Properties->Configuration Properties->Linker->General->Additional Library
Directories: E:\PM\SqlLtDb\Release;
运行时库设置为:多线程调试 DLL (/MDd)(我没有更改它)。
我将 files: 复制SqlLtDb.dll, SqlLtDb.lib, SqlLtDb.def, sqlite3.dll
到生成的 Debug 文件夹中consoleApplication.exe
。我将文件添加到存储源文件的SqlLtDb.h
文件夹中。consoleApplication's
函数 mainconsoleApplication
如下所示:
#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
导出成功,但问题出在类的导出方法上。我不会导出所有类,最好是导出指向类的指针。
谢谢