C ++ - метод класса не будет экспортировать из dll (VS - win) - PullRequest
0 голосов
/ 18 июля 2011

Я создал пример проекта 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 экспортируется успешно, но проблема заключается в методах экспорта из класса.Я не буду экспортировать весь класс, лучше указатель экспорта в класс.

Спасибо

1 Ответ

1 голос
/ 18 июля 2011

Вам необходимо экспортировать класс в DLL с помощью __declspec(dllexport) и импортировать его в коде ссылки с __declspec(dllimport).Пример:

class SQLLTDB_API CSqlLtDb {
    ...
};

Вам не нужен SQLLTDB_API для каждого члена, только класс - компоновщик сгенерирует экспорт для каждого метода для вас.

...