Ako na knižnicu, aneb Qt a .dll/.obj
Ako na knižnicu, aneb Qt a .dll/.obj
Zdravím. Potýkam sa s takým väčším problémom a síce:
Potrebujem v Qt vytvoriť aplikáciu, ktorá využíva GPIB (ak nevieš, čo je to GPIB, nevadí, čítaj ďalej). Mám k tomu gpib-32.dll a gpib-32.obj + jeden header.
V CodeBlocks som to dokázal spojazniť jednoducho a síce prilinkovaním .obj fajlu, takže mi to všetko pekne funguje ako má.
Rozbehať to v Qt Creatore (v. 2.4.1) sa ale zdá byť nemožné. Robím to podľa všetkých možných návodov na internete, no stále mi píše buď "Neviem otvoriť ...", alebo "invalid or corrupt file: cannot read at 0x..."
A to ako pri .obj, tak pri .dll.
Pýtam sa teda, má s týmto niekto nejaké skúsenosti? Nejaký nápad?
Prípadne, ak mi to v CodeBlocks funguje, viem s tým niečo vyčarovať a zariadiť, aby to šlo aj v Qt?
(Príp. môžem Qt zmeniť za .NET, alebo aj iné okienka pre windows. Potrebné knižnice sú ale robené v C (nie je to len táto), takže ak má niekto nejaký nápad, sem s ním)
Potrebujem v Qt vytvoriť aplikáciu, ktorá využíva GPIB (ak nevieš, čo je to GPIB, nevadí, čítaj ďalej). Mám k tomu gpib-32.dll a gpib-32.obj + jeden header.
V CodeBlocks som to dokázal spojazniť jednoducho a síce prilinkovaním .obj fajlu, takže mi to všetko pekne funguje ako má.
Rozbehať to v Qt Creatore (v. 2.4.1) sa ale zdá byť nemožné. Robím to podľa všetkých možných návodov na internete, no stále mi píše buď "Neviem otvoriť ...", alebo "invalid or corrupt file: cannot read at 0x..."
A to ako pri .obj, tak pri .dll.
Pýtam sa teda, má s týmto niekto nejaké skúsenosti? Nejaký nápad?
Prípadne, ak mi to v CodeBlocks funguje, viem s tým niečo vyčarovať a zariadiť, aby to šlo aj v Qt?
(Príp. môžem Qt zmeniť za .NET, alebo aj iné okienka pre windows. Potrebné knižnice sú ale robené v C (nie je to len táto), takže ak má niekto nejaký nápad, sem s ním)
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Jednoducho chceš ten header vložiť do svojho projektu správne? Ak hej tak musíš do .pro vložiť INCLUDEPATH a ešte do tvojho projektu tam kde bude menoprojektu+release/debug tam musíš vložiť to .dll
-
harrison314
Hardcore addict
- Príspevky: 8223
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Je to sice strela naslepo ale pri Lua libkach mi to pomohlo,
obal include tej kniznice do extern "C"
Ak nepomoze, osobne by som siel do C# , kde cez DllImport a namescpace system.runtime.interopservices mozes vyuzivat vsetko co je v natvynch DLL-kach,
len treba pozorne citat hlavickovy subor tej libky aby si dal spravne typy,
ak ty daco nebude jasne alebo nepojde poradim, mam vela skusenosti s prepajanim natyvneho a manazovaneho kodu.
obal include tej kniznice do extern "C"
Kód: Vybrať všetko
extern "C" {
#include "gpib.h"
}
len treba pozorne citat hlavickovy subor tej libky aby si dal spravne typy,
ak ty daco nebude jasne alebo nepojde poradim, mam vela skusenosti s prepajanim natyvneho a manazovaneho kodu.
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Viper: Vyzerá mi to tam takto:
build píše
DLLku mám nakopírovanú úplne všade.
Harrison: V extern C to je. Pre Qt sme sa rozhodli preto, že kolega (čo robí okienka) mal práve problém s tým managed/unmanaged kódom a tiež preto, že v budúcnosti MOŽNO bude potrený port na linux. Preto by sme radšej šli v Qt.
Ak to ale niagraz nepôjde a rozhodneme sa pre C#, napíšem ti určite správu, ak smiem
(Príp. máme ešte plán B, ktorý bude fungovať určite, ale radšej by som vyriešil toto)
Kód: Vybrať všetko
QT += core gui
TARGET = IEAP3
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h \
PowerSupplier.hpp \
gpib-32.hpp
FORMS += mainwindow.ui
INCLUDEPATH += "C:\Users\BX\Documents\Qt projects\IEAP3\"
LIBS += "C:\Users\BX\Documents\Qt projects\IEAP3\gpib-32.dll"
Kód: Vybrať všetko
error: LNK1107: invalid or corrupt file: cannot read at 0x2B8 (gpib-32.dll)Harrison: V extern C to je. Pre Qt sme sa rozhodli preto, že kolega (čo robí okienka) mal práve problém s tým managed/unmanaged kódom a tiež preto, že v budúcnosti MOŽNO bude potrený port na linux. Preto by sme radšej šli v Qt.
Ak to ale niagraz nepôjde a rozhodneme sa pre C#, napíšem ti určite správu, ak smiem
(Príp. máme ešte plán B, ktorý bude fungovať určite, ale radšej by som vyriešil toto)
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Pokial viem v C++ sa v ramci linkovania nikdy nelinkuje priamo DLL, ale OBJ/LIB. Nekusal si tam teda pri LIBS napisat namiesto *.dll to *.obj?
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Samozrejme, že skúšal. (Skoro) to isté:
A ak dám do LIBS
píše
Lenže ja .lib nemám! Prečo mi toto robí
(A ak obj premenujem na lib, píše zase rovnaký corrupt)
(Nejaký chytrý prepínač nepoznáte? Na msdn som nič použiteľné nenašiel - je tam MS Visual C++ compiler)
Kód: Vybrať všetko
error: LNK1107: invalid or corrupt file: cannot read at 0x6966Kód: Vybrať všetko
-l"C:\Users\BX\Documents\Qt projects\IEAP3\gpib-32.obj"
alebo len -lgpib-32Kód: Vybrať všetko
error: LNK1104: cannot open file 'C:\Users\BX\Documents\Qt projects\IEAP3\gpib-32.obj.lib'(Nejaký chytrý prepínač nepoznáte? Na msdn som nič použiteľné nenašiel - je tam MS Visual C++ compiler)
-
harrison314
Hardcore addict
- Príspevky: 8223
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Pri statickom linkovani sa da linkovat aj priamo DLL, vtedy sa stava sucastou execka, takze je to mozne.metthal napísal:Pokial viem v C++ sa v ramci linkovania nikdy nelinkuje priamo DLL, ale OBJ/LIB. Nekusal si tam teda pri LIBS napisat namiesto *.dll to *.obj?
BX: jasne ze mozes
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Neúspešne...BX napísal:(A ak obj premenujem na lib, píše zase rovnaký corrupt)
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Tak toto o statickom linkovani DLL som nevedel, pretoze 99% casu linkujem dynamicky. To ci ti premenovanie obj na lib pojde neviem zarucit, ja ani nemam sajnu ako funguje ten Qt Creator. Ked som robil s Qt tak som si ho radsej rozbehal pod Visual Studiom.
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Toto je dobrý nápad!metthal napísal:Ked som robil s Qt tak som si ho radsej rozbehal pod Visual Studiom.
-
harrison314
Hardcore addict
- Príspevky: 8223
- Registrovaný: 27 máj 2009, 20:42
- Bydlisko: Bratislava
- Kontaktovať používateľa:
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Ja som si nevsimol tvoju poslednu vetu, mne to pri jednej libke pomohlo, este ma napdlo nevyzaduje ta kniznica nejakey specialny prepinac? Napriklad niektore kniznice potrebuju osobitne prepinac pre linker aj kompilator ( napr OpenMP potrebuje -fopenmp pre linker a -fopenmp pre prekladac ),BX napísal: Neúspešne...
este skus puzit dependency walker na gpib-32.dll, ci nie je nevyhodi nejaku zavislost ktoru nemas v projekte.
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Visual Studio hádzalo rovnaké chyby, tak som sa ešte raz pozrel do útrob National Instruments a našiel .obj knižnicu, ktorá mala síce rovnaké meno, ale inú veľkosť. Linkol som ju presne tak, ako som to robil a všetko beží ako má.
A aké z toho plynie ponaučenie? Keď vám nejde nalinkovať knižnica a linkujete ju správne, chyba nebude v postupe
Debilný som. Ďakujem všetkým za účasť.
Ale trable s Qt sa nekončia... už to vidím.
A aké z toho plynie ponaučenie? Keď vám nejde nalinkovať knižnica a linkujete ju správne, chyba nebude v postupe
Debilný som. Ďakujem všetkým za účasť.
Ale trable s Qt sa nekončia... už to vidím.
Re: Ako na knižnicu, aneb Qt a .dll/.obj
Potom napíš robím v Qt denne možno ti poradím 