2017-01-09 2 views
0

У меня есть внешние библиотеки как в .dll и .lib и у меня есть свой файл .h имя библиотеки является «MTK_288_K001» [длл |. .lib | .h]как связать библиотеки DLL в кварт

Здесь мой 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); 

Когда я построить проект кварта дает мне это:

D:\kiosk\main.cpp:-1: error: undefined reference to `MTK288KROpen(char*)@4' 

Как я могу сказать Qt, чтобы найти эту функцию во внешних библиотеках?

+0

Если MTK_288_K001 является библиотекой C, вам нужно добавить 'extern 'C" {} 'around' #include" MTK_288_K001.h "'. В любом случае вы можете использовать ходячий ходячий элемент, чтобы увидеть символы в MTK_288_K001.dll и найти «MTK288KROpen» или что-то подобное. –

+0

удалить ** static staticlib ** – eyllanesc

+0

, даже удалив 'static staticlib' или' extern 'C "{}' around '#include" MTK_288_K001.h "', qt все еще дает мне эту ошибку. и '' MTK288KROpen ''существует в dll-файле – COP

ответ

0

С вашего комментария у вас есть символ MTK288KROpen, определенный в вашей DLL. Однако компоновщик жалуется, что MTK288KROpen(char*)@4 не определен.

Это, скорее всего, вызвано «плохим» объявлением функции HANDLE APIENTRY MTK288KROpen(char *Port).

Как сказано в моем комментарии, добавление extern "C" должно исправить проблему, сделав компоновщик в поиске символа MTK288KROpen, а не для MTK288KROpen(char*)@4.

Я подозреваю, что предложение, которое я сделал ранее в моем комментарии, чтобы добавить extern "C" { } вокруг #include "MTK_288_K001.h" не работает, потому что вы уже включают в себя MTK_288_K001.h в mainwindow.h.

Чтобы быть уверенным, добавьте extern "C" к MTK288KROpen декларации в MTK_288_K001.h, как это:

... 
// This is C++ code so you cannot compile MTK_288_K001.dll anymore with this change, but it should work with your Qt app 
extern "C" HANDLE APIENTRY MTK288KROpen(char *Port); 
HANDLE APIENTRY MTK288KROpenWithBaut(char *Port, unsigned int Baudrate); 
... 

линкер не должен жаловаться MTK288KROpen больше, но может все еще жалуется на другие функции.

Если у вас все еще есть ошибка для MTK288KROpen, пожалуйста, сообщите мне, если он новый, поэтому я могу обновить свой ответ соответственно. А также скажите, что такое значение APIENTRY.

Если это сработало, у вас есть 2 варианта в зависимости от того, можете ли вы редактировать MTK_288_K001.h.

Если вы можете редактировать, добавлять extern "C" к нему так:

#ifdef __cplusplus 
extern "C" { 
#endif 

[...] 

#ifdef __cplusplus 
} 
#endif 

Если вы не можете, создать промежуточный файл MTK_288_K001_CPP.h и использовать его вместо MTK_288_K001.h в проекте Qt:

extern "C" 
{ 
#include "MTK_288_K001.h" 
} 
+0

это мой код, я попробовал то, что вы сказали. [GitHub] (https: // GitHub.com/behnejad/kiosk.git) – COP

+0

«extern» C «' необходимо, но похоже, что 'MTK288K001.lib' не соответствует' MTK288K001.dll', удаление 'MTK288K001.lib' позволяет компилировать проект и связывать его , –

+0

проблема исправлена. и появляется другая проблема. программа не может работать после сборки. qt дает 'Программа неожиданно завершена. ' – COP

Смежные вопросы