【发布时间】:2017-01-09 16:06:07
【问题描述】:
我在 .dll 和 .lib 中都有一个外部库,并且我有它的 .h 文件 库名称是'MTK_288_K001'[.dll|.lib|.h]
这是我的 qt.pro:
QT += core gui serialport
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++14 static staticlib
TARGET = kiosk
TEMPLATE = app
SOURCES += main.cpp \
mainwindow.cpp \
serialport.cpp
RESOURCES += resources.qrc
win32: RC_ICONS = icon.ico
FORMS += mainwindow.ui
HEADERS += mainwindow.h \
serialport.h
win32 {
LIBS += -lMTK_288_K001
LIBS += -L$$PWD/ -lMTK_288_K001
}
INCLUDEPATH += $$PWD
DEPENDPATH += $$PWD
win32:!win32-g++: PRE_TARGETDEPS += $$PWD/MTK_288_K001.lib
else:win32-g++: PRE_TARGETDEPS += $$PWD/MTK_288_K001.lib
main.cpp
#include <QApplication>
#include "mainwindow.h"
#include "MTK_288_K001.h"
int main(int argc, char *argv[])
{
MTK288KROpen("COM1");
qputenv("QT_AUTO_SCREEN_SCALE_FACTOR", "1");
QCoreApplication::addLibraryPath("./plugins");
QApplication a(argc, argv);
MainWindow mw;
mw.show();
return a.exec();
}
MTK_288_K001.h
#define Bad_CommOpen -101
#define Bad_CommClose -105
#define OK 0
#define ERR -1
#define Parameter_Error -2
#define UpLoadErrorData -3
#define UpLoadTimeOut -4
#define UpLoadCancel -5
#include <windows.h>
int APIENTRY GetSysVerion(char *strVerion);
HANDLE APIENTRY MTK288KUOpen();
int APIENTRY MTK288KUClose(HANDLE ComHandle);
int APIENTRY MTK288KUMultOpen(HANDLE DeviceHdlData[],int *DeviceNumbers);
int APIENTRY MTK288KUMultClose(HANDLE DeviceHdlData[],int DeviceNumbers);
int APIENTRY GetDeviceCapabilities(HANDLE ComHandle, int *_InputReportByteLength, int *_OutputReportByteLength);
int APIENTRY ReadACKReport(HANDLE ComHandle, BYTE _ReportData[],BYTE _ReportLen);
int APIENTRY ReadUpReport(HANDLE ComHandle, BYTE _ReportData[],BYTE _ReportLen);
int APIENTRY ReadReport(HANDLE ComHandle, BYTE _ReportData[],BYTE _ReportLen);
int APIENTRY WriteReport(HANDLE ComHandle, BYTE _ReportData[],BYTE _ReportLen);
int APIENTRY USB_ExeCommand(HANDLE ComHandle,BYTE TxCmCode,BYTE TxPmCode,int TxDataLen,BYTE TxData[],BYTE *RxReplyType,BYTE *RxStCode1,BYTE *RxStCode0,int *RxDataLen,BYTE RxData[]);
HANDLE APIENTRY MTK288KROpen(char *Port);
HANDLE APIENTRY MTK288KROpenWithBaut(char *Port, unsigned int Baudrate);
int APIENTRY MTK288KRClose(HANDLE ComHandle);
int APIENTRY RS232_ExeCommand(HANDLE ComHandle,BYTE TxCmCode,BYTE TxPmCode,int TxDataLen,BYTE TxData[],BYTE *RxReplyType,BYTE *RxStCode1,BYTE *RxStCode0,int *RxDataLen,BYTE RxData[]);
int APIENTRY USB_UpTrackData(HANDLE ComHandle,BYTE tracks,BYTE ReadMode,BYTE _WaitTime,BYTE *RxReplyType,int *_CardDataLen,BYTE _CardData[]);
int APIENTRY USB_Cancel_UpTrackData(HANDLE ComHandle);
int APIENTRY RS232_UpTrackData(HANDLE ComHandle,BYTE tracks,BYTE ReadMode,BYTE _WaitTime,BYTE *RxReplyType,int *_CardDataLen,BYTE _CardData[]);
int APIENTRY RS232_Cancel_UpTrackData(HANDLE ComHandle);
当我构建项目时,qt 给了我这个:
D:\kiosk\main.cpp:-1: error: undefined reference to `MTK288KROpen(char*)@4'
如何让 qt 在外部库中找到这个函数?
【问题讨论】:
-
如果MTK_288_K001是C库,需要在
#include "MTK_288_K001.h"周围加上extern "C" { }。无论如何,您可以使用dependency walker查看MTK_288_K001.dll中的符号并搜索“MTK288KROpen”或类似的东西。 -
移除静态静态库
-
即使在
#include "MTK_288_K001.h"周围删除static staticlib或extern "C" { },qt 仍然给我这个错误。和'MTK288KROpen'存在于dll文件中
标签: c++ qt dll shared-libraries