Общая библиотека Qt Link в Visual Studio 2010 - PullRequest
0 голосов
/ 13 марта 2012

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

1 Ответ

2 голосов
/ 14 марта 2012

В командной строке, которую вы разместили для создания myapp.exe, я вижу конфигурацию для libpath /LIBPATH:"FILEPATH\MyQtFramework\Debug", но не вижу MyQtFramework.lib в качестве входного файла.

Вы также должны указать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...