Qt链接Visual Studio 2010中的共享库

时间:2012-03-13 04:21:25

标签: c++ visual-studio-2010 qt shared-libraries

我正在开发一个项目,我必须抓住一些类并将它们放入共享库中。共享库负责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 \ MyQtFramework.pdb“/PDD:"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文件所在的Libs。这些设置在visual studio属性页上完成,而不是在* .pro文件中完成。

我包含全局标题,它有效。当我包含“storageProvider.h”时,我得到7个链接错误,这里有两个错误:

  

错误6错误LNK2001:未解析的外部符号“public:virtual int __thiscall storageProvider :: qt_metacall(enum QMetaObject :: Call,int,void * *)”(?qt_metacall @ storageProvider @@ UAEHW4Call @ QMetaObject @@ HPAPAX @ Z )E

     

错误2错误LNK2019:未解析的外部符号“__declspec(dllimport)public:void _ thiscall storageProvider :: put(class QString const&amp;,class QString const&amp;,class 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 /PDD:"FILEPATH\myapp\debug\myapp.pgd”/ TLBID:1 / DYNAMICBASE / NXCOMPAT / MACHINE:X86 / ERRORREPORT:QUEUE

1 个答案:

答案 0 :(得分:2)

在为myapp.exe的创建而发布的命令行中,我看到了libpath的配置/LIBPATH:"FILEPATH\MyQtFramework\Debug",但我没有看到MyQtFramework.lib作为输入文件。

您还需要指定它。