typedef HANDLE xyz ??
-
Hallo Jungs und Mädels,
ich habe bisher hauptsächlich mit JAVA programmiert, muss mich jetzt aber in einem Projekt auch mit C befassen... Habe ein Beispielprogramm das eine fertige DLL einer CanBUS-Karte benutzt. Doch ich schaffs nichtmal das Teil korrekt zu kompilieren.Ich hab der einfachheit halber Bloodshed Dev C++ als IDE genommen und ein Projekt erstellt in das ich alle Files der Beispielprogramms kopiert habe. Also inklusive der DLL und der dazugehörigen Header-File...
Beim kompilieren spuckt der Compiler folgendes aus:
Compiler: Default compiler Building Makefile: "C:\Documents and Settings\erti_o_stnt2\Desktop\CanCardXL-Project\Project-Folder\Makefile.win" Führt make... aus make.exe -f "C:\Documents and Settings\erti_o_stnt2\Desktop\CanCardXL-Project\Project-Folder\Makefile.win" all gcc.exe -c xlCANdemo/xlCANdemo.c -o xlCANdemo/xlCANdemo.o -I"C:/Dev-Cpp/include" -DBUILDING_DLL=1 In file included from xlCANdemo/xlCANdemo.c:38: xlCANdemo/.\bin\vxlapi.h:55: error: syntax error before "XLhandle" xlCANdemo/.\bin\vxlapi.h:55: warning: data definition has no type or storage class xlCANdemo/.\bin\vxlapi.h:841: error: syntax error before "XLhandle" xlCANdemo/xlCANdemo.c:53: error: syntax error before "g_hMsgEvent" xlCANdemo/xlCANdemo.c:53: warning: data definition has no type or storage class xlCANdemo/xlCANdemo.c:54: error: syntax error before "g_hRXThread" . . . .
In der Headerfile die er bemängelt steht in Zeile 55 folgendes:
typedef HANDLE XLhandle;
Der Fehler in Zeile 841 der Headerfile scheint sich auf den Fehler in Zeile 55 zu beziehen. Will hier jetzt nicht die vielen Zeilen posten...
Kann mir jmd erklären warum das Fehl schlägt ? Ist "HANDLE" ein ungültiger Typ oder wie ? Oder benutze ich den falschen Compiler oder die falschen COmpiler-Parameter ?
In der API-Doku der Hersteller-DLL steht nur das das ganez C und C++ Kompatibel ist. Mehr nicht. Der Beispielcode den ich hier verusche zu kompilieren ist auch direkt vom Treiber ... sollte also gehen...
Weiß jmd bescheid ?
Gruss Alex
-
hi,
vielleicht ist das für windows gecodet, da ist HANDLE ein void*
aber eigentlich sollte auch sowas gehen, wenn du windows.h nicht includen willst:typedef unsigned int XLhandle;
-
Hmm, ja, das ist von und für Windows gecodet.
Der Witz an der Sache:
Die DLL ist "closed source", ich hab also nur eine .DLL und eine .H File... Und ich kann ja nicht einfach die Header-File ändern ohne den Quellcode der .DLL zu ändern, oder ?Liegts vllt. doch an einer Compiler-Option ?
Gruss
Alex
-
alex0801 schrieb:
Und ich kann ja nicht einfach die Header-File ändern ohne den Quellcode der .DLL zu ändern, oder ?
doch, kannste, die dll stört das nicht. aber #include einfach <windows.h> bevor du dieses header-file includest. das sollte das problem mit dem HANDLE beseitigen
-
Tatsächlich, das geht...
Da scheint was im Code nicht gestimmt zu haben...Aus dem hier:
#if defined(_Windows) || defined(_MSC_VER) #define STRICT #include <windows.h> #endif
hab ich jetzt das hier gemacht:
//#if defined(_Windows) || defined(_MSC_VER) // #define STRICT #include <windows.h> //#endif
Ist aber sicherlich nicht die feine Art..
Und jetzt gibts nur noch folgende Errors:
Compiler: Default compiler Building Makefile: "C:\Documents and Settings\erti_o_stnt2\Desktop\CanCardXL-Project\Project-Folder\Makefile.win" Führt make... aus make.exe -f "C:\Documents and Settings\erti_o_stnt2\Desktop\CanCardXL-Project\Project-Folder\Makefile.win" all gcc.exe xlCANdemo/xlCANdemo.o -o "canCardXLWrapper.exe" -L"C:/Dev-Cpp/lib" --no-export-all-symbols --add-stdcall-alias xlCANdemo/vxlapi.lib -fmessage-length=0 xlCANdemo/xlCANdemo.o(.text+0x2c7):xlCANdemo.c: undefined reference to `_imp__xlCanTransmit' xlCANdemo/xlCANdemo.o(.text+0x2d9):xlCANdemo.c: undefined reference to `_imp__xlGetErrorString' xlCANdemo/xlCANdemo.o(.text+0x3e8):xlCANdemo.c: undefined reference to `_imp__xlCanTransmit' xlCANdemo/xlCANdemo.o(.text+0x3fa):xlCANdemo.c: undefined reference to `_imp__xlGetErrorString' xlCANdemo/xlCANdemo.o(.text+0x462):xlCANdemo.c: undefined reference to `_imp__xlActivateChannel' xlCANdemo/xlCANdemo.o(.text+0x474):xlCANdemo.c: undefined reference to `_imp__xlGetErrorString' xlCANdemo/xlCANdemo.o(.text+0x4bb):xlCANdemo.c: undefined reference to `_imp__xlDeactivateChannel' xlCANdemo/xlCANdemo.o(.text+0x4cd):xlCANdemo.c: undefined reference to `_imp__xlGetErrorString' xlCANdemo/xlCANdemo.o(.text+0x535):xlCANdemo.c: undefined reference to `_imp__xlDeactivateChannel' xlCANdemo/xlCANdemo.o(.text+0x55d):xlCANdemo.c: undefined reference to `_imp__xlCanSetChannelOutput' xlCANdemo/xlCANdemo.o(.text+0x56f):xlCANdemo.c: undefined reference to `_imp__xlGetErrorString' xlCANdemo/xlCANdemo.o(.text+0x5cf):xlCANdemo.c: undefined reference to `_imp__xlActivateChannel' xlCANdemo/xlCANdemo.o(.text+0x60e):xlCANdemo.c: undefined reference to `_imp__xlSetNotification' xlCANdemo/xlCANdemo.o(.text+0x661):xlCANdemo.c: undefined reference to `_imp__xlOpenDriver' xlCANdemo/xlCANdemo.o(.text+0x67f):xlCANdemo.c: undefined reference to `_imp__xlGetDriverConfig' xlCANdemo/xlCANdemo.o(.text+0x799):xlCANdemo.c: undefined reference to `_imp__xlOpenPort' xlCANdemo/xlCANdemo.o(.text+0x7ab):xlCANdemo.c: undefined reference to `_imp__xlGetErrorString' xlCANdemo/xlCANdemo.o(.text+0x838):xlCANdemo.c: undefined reference to `_imp__xlCanSetChannelBitrate' xlCANdemo/xlCANdemo.o(.text+0x84a):xlCANdemo.c: undefined reference to `_imp__xlGetErrorString' . . ganze viel Zeilen die ähnlich aussehen... . . . xlCANdemo/xlCANdemo.o(.text+0x10b7):xlCANdemo.c: undefined reference to `_imp__xlGetEventString' xlCANdemo/xlCANdemo.o(.text+0x10eb):xlCANdemo.c: undefined reference to `_imp__xlReceive' collect2: ld returned 1 exit status make.exe: *** [canCardXLWrapper.exe] Error 1 Ausführung beendet
Hätte nie gedacht dass es so "schwer" ist ein fertiges Programm zu compilen.
-
alex0801 schrieb:
Hätte nie gedacht dass es so "schwer" ist ein fertiges Programm zu compilen.
naja, der code ist für m$-visualc, du benutzt aber mingw(devcpp). die sind schon etwas unterschiedlich d.h. man muss einiges rumbasteln damit. vielleicht hilft das hier weiter: http://www.emmestech.com/software/cygwin/pexports-0.43/moron1.html
-
Aloha Vera,
ich bin auf selbiges Problem gestossen und habe mich durchgebissen. 'xlCANdemo.c' kompiliert in der aktuellen Version der 'XL Driver Library' anstandslos.
Ich habe nicht MinGW sondern Cygwin verwendet!
Nun gilt es noch die Linkerfehler wie
[..] xlCANdemo/xlCANdemo.o(.text+0x4bb):xlCANdemo.c: undefined reference to `_imp__xlDeactivateChannel' [..]
zu beseitigen.
Ich hab's wie folgt gemacht:
Die Dateienvxlapi.dll
vxlapi.h
xlCANdemo.c
pexports.exein ein Verzeichnis kopieren und in dieses Verzeichnigs wechseln.
pexports.exe kann auf [1] heruntergeladen werden..DEF File erzeugen
$ ./pexports vxlapi.dll | sed 's/^_//' > vxlapi.def
Import Library erzeugen
$ dlltool --input-def vxlapi.def --dllname vxlapi.dll --output-lib libvxlapi.a -k
Achtung: die Bezeichung libvxlapi.a ist wichtig, sonst findet der Linker die Library nicht!
Library kopieren
$ cp libvxlapi.a /usr/lib/w32api $ ranlib /usr/lib/w32api/libvxlapi.a
Programm kopilieren
$ gcc xlCANdemo.c -o Demo -lvxlapi
Programm ausführen
./Demo
Leider führt dies zu
Segmentation fault (core dumped)
Schuld daran sind printf-%s-String-Ausgaben in Kombination mit einer HEX-Ausgabe. Die Ursache habe ich nicht länger untersucht. Es kann jedoch relativ einfach Abhilfe geschafft werden.
Beispielsweise wirdprintf("- ActivateChannel : CM=0x%I64x, %s\n\n", g_xlChannelMask, xlGetErrorString(xlStatus));
zu
printf("- ActivateChannel : CM=0x%I64x", g_xlChannelMask); printf(", %s\n\n",xlGetErrorString(xlStatus));
dann funktionierts anstandslos. Es sind ettliche ähnlicher Zeilen vorhanden.
Aber dann tut's:-)
Gruess
fb
[1] http://www.emmestech.com/software/cygwin/pexports-0.43/moron1.html
[2] http://www.cygwin.com/cygwin-ug-net/dll.html