Я создал пример проекта 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();
А в SqlLtDb.cpp методы реализованы следующим образом (я показываю только две реализации):
...
int SQLLTDB_API CSqlLtDb::getNameOfClass()
{
return 777;
}
extern "C" SQLLTDB_API CSqlLtDb* getInstanceCSblLtDb()
{
CSqlLtDb* instance = new CSqlLtDb("");
return instance;
}
SqlLtDb.def fileвыглядит так:
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.И я добавил файл SqlLtDb.h в папку, где хранятся исходные файлы consoleApplication.
Функция 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 экспортируется успешно, но проблема заключается в методах экспорта из класса.Я не буду экспортировать весь класс, лучше указатель экспорта в класс.
Спасибо