C++ VisualStudio2010中的Qt链接共享库
我正在做一个项目,我必须抓取一些类并将它们放入一个共享库中。共享库负责REST调用,并将由主项目使用 共享库的*.pro文件如下所示:C++ VisualStudio2010中的Qt链接共享库,c++,visual-studio-2010,qt,shared-libraries,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 += \ myfra
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中的命令行如下所示:
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"
/OUT:“debug\MyQtFramework.dll”/NOLOGO/LIBPATH:“E:\QT\4.8.0\lib”/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”“shell32.lib”“advole32.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”/PGD:“PROJECTPATH\DEBUG\MyQtFramework.PGD”/TLBID:1/DYNAMICBASE/NXCOMPAT/MACHINE:X86/ERRORREPORT:QUEUE
在这里,我看不到任何指定它是一个库以及如何导出它的标志
然后,我为共享库“g_global.h”创建一个全局标头:
到目前为止还不错,对吗?这是在Visual Studio 2010中编译的,不会给出任何错误。问题是当我尝试在主项目中使用它时。然后我使用INCLUDEPATH和LIBS,其中include路径指向共享lib的头文件所在的位置和*.lib文件所在的LIBS。这些设置在Visual Studio pro上完成perty页,不在*.pro文件中
I包含全局标题,这很有效。当我包含“storageProvider.h”时,我会得到7个链接错误,其中有两个:
错误6错误LNK2001:未解析的外部符号“public:virtual int\u thiscall storageProvider::qt\u metacall(enum QMetaObject::Call,int,void**)”(?qt_metacall@storageProvider@@UAEHW4Call@QMetaObject@@HPAPAX@Z)E
错误2错误LNK2019:未解析的外部符号“\u declspec(dllimport)public:void\u thiscall storageProvider::put(类QString const&,类QString const&,类QPointer,int)”(\u imp?put@storageProvider@@QAEXABVQString@@0V$QPointer@VQIODevice@@@@H@Z)在函数“public:void\u thiscall FileUploader::uploadNext(void)”中引用(?uploadNext@FileUploader@@QAEXZ)
我不知道如何包括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\lib\debug”/LIBPATH:“FILEPATH\MyQtFramework\debug”“E:\QT\4.8.0\lib\qtmaind.lib”“E:\QT\4.8.0\lib\QT\declaratived4.lib”“E:\QT\QT\guid4.0\qt4.0\QT\network”E:\QT\4.8.0\lib\QtCored4.lib“kernel32.lib”“user32.lib”“gdi32.lib”“winspool.lib”“comdlg32.lib”“advapi32.lib”“shell32.lib”“ole32.lib”“uuid.lib”“odbc32.lib”“odbccp32.lib”“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
在为创建
myapp.exe
而发布的命令行中,我看到了libpath的配置,/libpath:“FILEPATH\MyQtFramework\Debug”
,但我没有看到MyQtFramework.lib
作为输入文件
您也需要指定它。因此您配置了*.lib文件所在的路径,但是您是否配置了构建以实际使用该.lib文件作为输入?这两个东西是相关的,但不同的.LIBS+=-lMyQtFramework?我想您说过您没有使用
.pro
文件来构建myapp.exe
?im不太确定.pro文件涉及多少内容。我使用它并将其导入visual studio,它尝试使用设置创建自己的文件。因此不确定发生了什么。我可以直接向命令行添加任何内容吗?谢谢。它现在正在生成。但是,您知道我在单击“将项目转换为qmake生成的项目”时做了什么吗"似乎无法从那里返回到Config prop->Linker->Input->Additional dependesis并在那里添加了lib文件。还必须将共享libs.dll添加到与主应用程序相同的文件夹中。对不起,我已经有一段时间没有为VS使用Qt插件了,目前还没有安装它,因此我无法帮助进行de我知道。
#include "g_global.h"
class SHARED_EXPORT_IMPORT storageProvider : public QObject {
....