Я работаю над проектом, в котором мне нужно взять некоторые классы и поместить их в общую библиотеку.Общая библиотека заботится о вызовах REST и будет использоваться основным проектом.
Файл * .pro для общей библиотеки выглядит следующим образом:
QT += network
QT -= gui
TARGET = MyQtFramework
TEMPLATE = lib
DEFINES += MY_LIBRARY
SOURCES += \
storageprovider.cpp \
handler.cpp
HEADERS += \
myframework_global.h \
storageprovider.h \
handler.h
INCLUDEPATH += "../Shared"
INCLUDEPATH += "E:\src\Lib\Boost\Current"
INCLUDEPATH += "E:\src\Lib\CryptLite\Current"
INCLUDEPATH += "E:\QT"
LIBS += -L"E:\src\Lib\Boost\Current"
А командная строка из Visual Studio выглядит следующим образом:
/ OUT: "debug \ MyQtFramework.dll" / NOLOGO /LIBPATH:"E:\QT\4.8.0\lib "/ LIBPATH:" E: \ src \ Lib \ Boost \ Current "/ LIBPATH:" E: \ src \ Lib\ Boost \ Current \ lib \ debug "/ DLL" E: \ QT \ 4.8.0 \ lib \ QtNetworkd4.lib "" E: \ QT \ 4.8.0 \ lib \ QtCored4.lib "" kernel32.lib "" user32.lib "" gdi32.lib "" winspool.lib "" comdlg32.lib "" advapi32.lib "" shell32.lib "" ole32.lib "" oleaut32.lib "" uuid.lib "" odbc32.lib "" odbccp32.lib "/ MANIFEST /ManifestFile:"Win32\MyQtFramework.dll.intermediate.manifest" / ALLOWISOLATION / MANIFESTUAC: "level = 'asInvoker' uiAccess = 'false'" / DEBUG /PDB:"PROJECTPATH\debug\meypf/PGD:"PROJECTPATH\debug\MyQtFramework.pgd "/ TLBID: 1 / DYNAMICBASE / NXCOMPAT / MACHINE: X86 / ERRORREPORT: QUEUE
Здесь я не вижу никаких флагов, указывающих, что это библиотекаи как это экспортируется.
Затем я создаю глобальный заголовок для общей библиотеки "g_global.h":
#ifndef G_GLOBAL_H
#define G_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(MY_LIBRARY)
# define SHARED_EXPORT_IMPORT Q_DECL_EXPORT
#else
# define SHARED_EXPORT_IMPORT Q_DECL_IMPORT
#endif
#endif
И все остальные мои заголовочные файлы выглядят так:
#include "g_global.h"
class SHARED_EXPORT_IMPORT storageProvider : public QObject {
....
Итактак хорошо, правда?Это компилируется в Visual Studio 2010 и не дает никаких ошибок.Проблема в том, когда я пытаюсь использовать его в своем основном проекте.Затем я включаю INCLUDEPATH и LIBS, которые включают в себя путь, указывающий, где находятся файлы заголовков для общей библиотеки, и библиотеки, в которых находится файл * .lib.Эти настройки выполняются на странице свойств Visual Studio, а не в файле * .pro.
Я включаю глобальный заголовок, который работает.Когда я включаю «storageProvider.h», я получаю 7 ошибок компоновки, вот две из них:
Ошибка 6 ошибка LNK2001: неразрешенный внешний символ »public: virtual int __thiscall storageProvider :: qt_metacall (enumQMetaObject :: Call, int, void * *) "(? Qt_metacall @ storageProvider @@ UAEHW4Call @ QMetaObject @@ HPAPAX @ Z) E
Ошибка 2 Ошибка LNK2019: неразрешенный внешний символ" __declspec (dllimport) public:void _ thiscall storageProvider :: put (класс QString const &, класс QString const &, класс QPointer, int) "( _imp_? put @ storageProvider @@ QAEXABVQString @@ 0V? $ QPointer @ VQIODevice @@@@ H @ Z) упоминается в функции "public: void __thiscall FileUploader :: uploadNext (void)" (? UploadNext @ FileUploader @@ QAEXXZ)
Я не знаю, как можно включитьStorageProvider и использовать его.
Обратите внимание: я переименовал все функции и классы, поэтому, если что-то кажется неправильным, укажите это, но это может быть просто ошибкой, которую я допустил, когда переименовал вещи.
Командная строка для основного проекта:
/ OUT: "debug \ myapp.exe" / NOLOGO /LIBPATH:"E:\QT\4.8.0\lib "/ LIBPATH: "e: \ QT \ 4.8.0 \ lib" / LIBPATH: "E: \ src \ Lib \ Boost \ Current" / LIBPATH: "E: \ src \ Lib \ Boost \ Current \ lib \ debug" / LIBPATH:"FILEPATH \ MyQtFramework \ Debug" "E: \ QT \ 4.8.0 \ lib \ qtmaind.lib" "E: \ QT \ 4.8.0 \ lib \ QtDeclaratived4.lib" "E: \ QT \ 4.8.0 \ lib\ QtGuid4.lib "" E: \ QT \ 4.8.0 \ lib \ QtNetworkd4.lib "" E: \ QT \ 4.8.0 \ lib \ QtCored4.lib "" kernel32.lib "" user32.lib "" gdi32.lib "" winspool.lib "" comdlg32.lib "" advapi32.lib "" shell32.lib "" ole32.lib "" oleaut32.lib "" uuid.lib "" odbc32.lib "" odbccp32.lib "/ MANIFEST /ManifestFile: "Win32 \ myapp.exe.intermediate.manifest" / ALLOWISOLATION / MANIFESTUAC: "level = 'asInvoker' uiAccess = 'false'" / DEBUG /PDB:"FILEPATH\myapp\debug\myapp.pdb "/ SUBSYSTEM: WINDOWS/PGD:"FILEPATH\myapp\debug\myapp.pgd "/ TLBID: 1 / DYNAMICBASE / NXCOMPAT / MACHINE: X86 / ERRORREPORT: QUEUE