我正在开发一个项目,我必须抓住一些类并将它们放入共享库中。共享库负责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
答案 0 :(得分:2)
在为myapp.exe
的创建而发布的命令行中,我看到了libpath的配置/LIBPATH:"FILEPATH\MyQtFramework\Debug"
,但我没有看到MyQtFramework.lib
作为输入文件。
您还需要指定它。