# libnodave mit DevC++ kompilieren



## Thomas_v2.1 (11 November 2006)

Hallo,
ich versuche gerade das Beispielprogramm "testISO_TCP" von Libnodave mit dem DevC++ Kompiler zu übersetzen.
Jetzt bekomme ich beim übersetzen jedoch einige Fehlermeldungen:

1) In der nodave.h bekomme ich mehrere Syntaxfehler z.B. bei  "EXPORTSPEC" und "DECL2" die nirgends definiert wurden.

2) In der opensocket.c werden mehrere Header includiert, z.B. netdb.h etc. die es bei meinem System nicht gibt. Soweit ich das gesehen habe sollen die Funktionen daraus in der winsock.h vorhanden sein. Da die Sourcen ja mit dem VC++ übersetzbar sein sollen, müssen die Dateien bei DevC++ anscheinend fehlen, oder nicht? Ein bedingtes unkludieren je nach Umgebung existiert ja nicht (die libwsock32.a ist dem Projekt hinzugefügt).

Vielleicht führt das hier im SPS-Forum zu weit, aber evtl. hat das ja schonmal jemand erfolgreich mit diesem Kompiler getestet,

Gruß
Thomas


----------



## zotos (11 November 2006)

Ich denke nicht das es an Devc++ oder dem Mingw32 liegt. 
Ich benutze auch DevCpp aber nur mit WinAVR und ohne Mingw32 folglich habe ich auch libnodave noch nicht mit dem Mingw32 ausprobiert.
Wie sehen denn deine Projekteinstellungen aus hast Du mal ein Visual-Studio Projekt importiert? Das kann der DevCpp meines Wissens nach.


----------



## Thomas_v2.1 (11 November 2006)

Hallo,
ein Visual-Projekt importieren kann ich ja nicht, hab keins. Das Makefile das bei libnodave dabei ist gilt ja auch zum erstellen der DLL, ich möchte die aber nur verwenden.
Aber rein für die testISO_TCP sieht mein Makefile eigentlich gleich aus, bis auf dass ich die libnodave.lib beim Linken angegeben habe.
Das Hauptproblem scheinen die nicht bekannten Bezeichner in der nodave.h zu sein (EXPORTSPEC, DECL2), und halt die nicht vorhandenen Headerfiles. Evtl. könnte man das zwar alles im Quelltext zurechtbiegen, aber ich denke nicht dass es vom Urheber mal so gedacht war sondern irgendwo an meinen Einstellungen liegt (Fehler sitzt vor der Tastatur ;-)

Anbei mal mein Makefile:

```
# Project: daveISO_on_TCP
# Makefile created by Dev-C++ 4.9.9.2

CPP  = g++.exe
CC   = gcc.exe
WINDRES = windres.exe
RES  = 
OBJ  = testISO_TCP.obj openSocket.obj $(RES)
LINKOBJ  = testISO_TCP.obj openSocket.obj $(RES)
LIBS =  -L"D:/Dev-Cpp/lib" libnodave.lib ../../Dev-Cpp/lib/libwsock32.a  
INCS =  -I"D:/Dev-Cpp/include" 
CXXINCS =  -I"D:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"D:/Dev-Cpp/include/c++/3.4.2/backward"  -I"D:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"D:/Dev-Cpp/include/c++/3.4.2"  -I"D:/Dev-Cpp/include"  -I"D:/Dev-Cpp/include/wx/msw"  -I"D:/Dev-Cpp/include/wx/generic"  -I"D:/Dev-Cpp/include/wx/animate"  -I"D:/Dev-Cpp/include/wx/fl"  -I"D:/Dev-Cpp/include/wx/gizmos"  -I"D:/Dev-Cpp/include/wx/html"  -I"D:/Dev-Cpp/include/wx/mmedia"  -I"D:/Dev-Cpp/include/wx/net"  -I"D:/Dev-Cpp/include/wx/ogl"  -I"D:/Dev-Cpp/include/wx/plot"  -I"D:/Dev-Cpp/include/wx/protocol"  -I"D:/Dev-Cpp/include/wx/stc"  -I"D:/Dev-Cpp/include/wx/svg"  -I"D:/Dev-Cpp/include/wx/xml"  -I"D:/Dev-Cpp/include/wx/xrc"  -I"D:/Dev-Cpp/include/wx" 
BIN  = daveISO_on_TCP.exe
CXXFLAGS = $(CXXINCS) 
CFLAGS = $(INCS) 
RM = rm -f

.PHONY: all all-before all-after clean clean-custom

all: all-before daveISO_on_TCP.exe all-after


clean: clean-custom
clean: 
    $(RM) $(OBJ) $(BIN)

$(BIN): $(OBJ)
    $(CC) $(LINKOBJ) -o "daveISO_on_TCP.exe" $(LIBS)

testISO_TCP.obj: testISO_TCP.c
    $(CC) -c testISO_TCP.c -o testISO_TCP.obj $(CFLAGS)

openSocket.obj: openSocket.c
    $(CC) -c openSocket.c -o openSocket.obj $(CFLAGS)
```


----------



## Zottel (13 November 2006)

Thomas_v2.1 schrieb:


> Hallo,
> ich versuche gerade das Beispielprogramm "testISO_TCP" von Libnodave mit dem DevC++ Kompiler zu übersetzen.
> Jetzt bekomme ich beim übersetzen jedoch einige Fehlermeldungen:


Deine Probleme stammen daher, daß der Code von libnodave so geschrieben ist, daß er für mehrere Zielsysteme übersetzt werden kann (Win32, Linux, Linux-ARM). Bei der Kompilierung muß das Zielsystem und die "Endianness" der Zielmaschine definiert werden, für Windows und i386:
-DBCCWIN -DDAVE_LITTLE_ENDIAN


Thomas_v2.1 schrieb:


> 1) In der nodave.h bekomme ich mehrere Syntaxfehler z.B. bei  "EXPORTSPEC" und "DECL2" die nirgends definiert wurden.


Diese Deklarationen werden durch BCCWIN oder LINUX passend definiert (hier ein Teil davon):

#ifdef BCCWIN
#ifdef DOEXPORT
#define EXPORTSPEC __declspec (dllexport) 
#else
#define EXPORTSPEC __declspec (dllimport) 
#endif
#endif

#ifdef LINUX
#define EXPORTSPEC
#define DECL2
#endif



> 2) In der opensocket.c werden mehrere Header includiert, z.B. netdb.h etc. die es bei meinem System nicht gibt.


Für welches System willst du es kompilieren?


> Soweit ich das gesehen habe sollen die Funktionen daraus in der winsock.h vorhanden sein.
> 
> 
> > Wenn es Windows ist...bei CE kenne ich mich nicht aus. Aber wenn dein noch so exotisches System TCP/IP kann, wird es eine Funktion zum Öffnen der Sockets geben und eine Header-Datei, wo diese Funktion bekannt gemacht wird. Du solltest dann der nodave.h bzw openSocket.h einen  bedingten Block hinzufügen:
> ...


----------



## Thomas_v2.1 (18 November 2006)

Danke Zottel für deine Ausführungen. Mittlerweile habe ich es hinbekommen das Testprogramm mit dem devcpp zu übersetzen.
Dabei habe ich wie du beschrieben hast die defines für DECL2 und EXPORTSPEC (einfacherweise) im BCCWIN-Bereich ersetzt. 
Bei den Compileroptionen muss dann beim devcpp auch -DBCCWIN -DDAVE_LITTLE_ENDIAN mit angegeben werden. Wenn dann noch die libwsock32.a aus dem DevCpp/lib Verzeichnis dem Linker mit angegeben wird funktioniert es.

Ich habe es zwischendurch mal mit den Borland Kommandozeilen-Tools probiert, bei diesem konnte ich es auf Anhieb ohne Änderungen übersetzen.
Warum man die Zeilen bei diesem nicht ändern muss ich mir nicht ganz klar. Ich habe die nodave-Funktionen da ja auch statisch gelinkt.


----------



## Zottel (20 November 2006)

Thomas_v2.1 schrieb:


> Danke Zottel für deine Ausführungen. Mittlerweile habe ich es hinbekommen das Testprogramm mit dem devcpp zu übersetzen.
> Dabei habe ich wie du beschrieben hast die defines für DECL2 und EXPORTSPEC (einfacherweise) im BCCWIN-Bereich ersetzt.
> Bei den Compileroptionen muss dann beim devcpp auch -DBCCWIN -DDAVE_LITTLE_ENDIAN mit angegeben werden.


Für eines der TESTPROGRAMME muß die Angabe von -DBCCWIN -DDAVE_LITTLE_ENDIAN reichen. 
EXPORTSPEC interessiert nur beim Übersetzen der .DLL selbst: durch die Definition -DDOEXPORT bewirkt, das EXPORTSPEC durch __declspec (dllexport) ersetzt wird. Ohne diese Definition wird es durch __declspec (dllimport) ersetzt. Die entstehenden Object files werden zum Linken der .DLL benutzt aber auch statisch zu den Testprogrammen gelinkt. Der Linker gibt dann eine Menge Warnungen aus: "locally defined symbol xxx imported in function main" aber das Ergebnis funktioniert problemlos.


> Wenn dann noch die libwsock32.a aus dem DevCpp/lib Verzeichnis dem Linker mit angegeben wird funktioniert es.


Weiß jetzt nicht, wie das bei devcpp ist, aber unter Linux sind Bibliotheken mit der Endung .a zum statischen Linken bestimmt und das entstehende Programm nimmt den kopletten Code auf, anstatt ihn mit anderen Programmen zu teilen.


> Warum man die Zeilen bei diesem nicht ändern muss ich mir nicht ganz klar. Ich habe die nodave-Funktionen da ja auch statisch gelinkt.


Man sollte nichts ändern müssen, es sei denn DevCpp verwendet andere Schlüsselworte für export und import.
Aber sei es, wie es sei, es freut mich, daß du weitergekommen bist.


----------

