# Debug-Infos von LibNoDave deaktivieren?



## muhmann (30 August 2010)

hallo zusammen,

ich verwende seit einiger Zeit LibNoDave recht erfolgreich und habe mein Programm soweit fertig. Bin derzeit dabei, die Ausgabe etwas zu verbessern. Was mir in diesem Zusammenhang aufgefallen ist, sind die Debug-Informationen von LibNoDave.

Hier mal ein Screenshot von dem was ich meine:






Ich frage in regelmäßigen Abständen meine analogen Eingänge ab, jedoch stören mich die "bind Socket error" und "Connected to host..." Ausgaben.

Diese Ausgaben sind in der "openSocket" Funktion zu finden (openSocket.c). Sie erfolgen über ein Makro, LOG2, welches in der log2.h definiert ist. Ich habe versucht die alternative Version dieses Markos mit "NO_PRINT_CODE" zu nutzen, was aber auch nichts genutzt hat. Ebenso funktionierte das auskommentieren der entsprechenden Zeilen nicht.

Diese Zeile ist die einzig Debugspezifische in meiner Funktion:

```
daveSetDebug(daveDebugPrintErrors);
```
Die anderen Debug-Defines zu "daveDebugPrintErrors" habe ich ebenfalls durchprobiert, aber ein Define zum deaktivieren scheint es nicht zu geben.

Habt Ihr vielleicht eine Idee wie ich die beiden Ausgaben deaktivieren kann?


----------



## pvbrowser (30 August 2010)

In log2.h

//######################################
#ifdef HAVE_PRINTF
#define LOG1(x) fprintf(logout,x)
#define LOG2(x,y) fprintf(logout,x,y)
#define LOG3(a,b,c) fprintf(logout,a,b,c)
#define LOG4(a,b,c,d) fprintf(logout,a,b,c,d)
#define LOG5(a,b,c,d,e) fprintf(logout,a,b,c,d,e)
#define LOG6(a,b,c,d,e,f) fprintf(logout,a,b,c,d,e,f)
#define LOG7(a,b,c,d,e,f,g) fprintf(logout,a,b,c,d,e,f,g)
#define FLUSH fflush(logout)

#define LOG_1(a) fprintf(logout,a)
#define LOG_2(a,b) fprintf(logout,a,b)
#endif /* HAVE_PRINTF */
//### ersetzen durch #############################
#ifdef HAVE_PRINTF
#define LOG1(x)
#define LOG2(x,y)
#define LOG3(a,b,c)
#define LOG4(a,b,c,d)
#define LOG5(a,b,c,d,e)
#define LOG6(a,b,c,d,e,f)
#define LOG7(a,b,c,d,e,f,g)
#define FLUSH

#define LOG_1(a)
#define LOG_2(a,b)
#endif /* HAVE_PRINTF */
//###################################
Und dann Bibliothek neu übersetzen.


----------



## muhmann (31 August 2010)

Danke für den Tipp, das hatte ich noch nicht versucht.

Ich kam gestern leider nicht mehr dazu zu antworten. Jedenfalls habe ich die log2.h geändert, hatte aber Probleme beim kompilieren der LibNoDave Bibliothek. Ich habe das Makefile.vc und die dazugehörige .bat entsprechend meinen Visual Studio 10 Pfaden angepasst, jedoch will das Makefile die .lib und die .dll nicht neu erstellen.

Muss man da evtl. etwas bestimmtes beachten?


----------



## pvbrowser (31 August 2010)

muhmann schrieb:


> ... hatte aber Probleme beim kompilieren der LibNoDave Bibliothek. Ich habe das Makefile.vc und die dazugehörige .bat entsprechend meinen Visual Studio 10 Pfaden angepasst, jedoch will das Makefile die .lib und die .dll nicht neu erstellen.
> 
> Muss man da evtl. etwas bestimmtes beachten?



Ich verwende hauptsächlich Linux und unter Windows MinGW.
Früher habe ich aber Visual C++ 6.0 verwendet.

Lege in Visual C++ doch einfach ein neues Projekt an
entweder als "Win32-Bibliothek (statisch)" (wahrscheinlich das Einfachste)
oder "Win32 Dynamic-Link Library"
und füge die Dateien "setportw.c nodave.c" in das Projekt ein.
Dann sollte doch schon alles OK sein.

Da fällt mir noch ein, dass es da eine BAT Datei von Visual C++ gbt, die Dir ein paar Environment Variablen setzt.
Vielleicht musst Du die ja erst aufrufen.
Bei VS 6.0 ist das:
c:\Programme\Microsoft Visual Studio\VC98\Bin\VCVARS32.bat


----------



## muhmann (31 August 2010)

Die statische Bibliothek konnte ich erstellen, jedoch reicht sie leider  nicht aus. Sobald ich mein Programm damit erstellen möchte, bringt er  bei den LibNoDave spezifischen Funktionen den Fehler "LNK2019: Verweis  auf nicht aufgelöstes externes Symbol ...". Das dürfte wegen der .dll  sein.

Ich habe das Projekt von einer statischen zu einer dynamischen  Bibliothek geändert. Hier bringt er die gleiche Fehlermeldung in den  Funktionen "daveReadISOPacket", "daveSendISOPacket" und "openSocket". Damit sind die  Befehle "recv", "select", "send" und einige weitere gemeint. Das sollten meines Wissens  nach Netzwerkbefehle sein.

winsock2.h wird jedenfalls eingebunden, daher sollte das eigentlich funktionieren. Ich verwende zum erstellen der dynamischen  Bibliothek die Dateien nodave.c und openSocketw.c. Sowie die Header dieser 2 Dateien und log2.h.

Benötigt LibNoDave evtl. einen speziellen socket-Header?
Mir scheint, dass es hier einige Probleme bei der Portierung auf Windows gibt. Zumal einige Header-Dateien Linux spezifisch sind. Z.b. die sys/socket.h


----------



## pvbrowser (31 August 2010)

muhmann schrieb:


> ... Damit sind die  Befehle "recv", "select", "send" und einige weitere gemeint. Das sollten meines Wissens  nach Netzwerkbefehle sein.



Du musst die wsock32 bzw. die neuere ws2_32 (kann auch Ipv6 usw.) mit angeben. Die die beiden Libs gehören zum Compiler. Die obigen funktionen gehören zur Socket Library.


----------



## Jochen Kühner (31 August 2010)

muhmann schrieb:


> Die statische Bibliothek konnte ich erstellen, jedoch reicht sie leider nicht aus. Sobald ich mein Programm damit erstellen möchte, bringt er bei den LibNoDave spezifischen Funktionen den Fehler "LNK2019: Verweis auf nicht aufgelöstes externes Symbol ...". Das dürfte wegen der .dll sein.
> 
> Ich habe das Projekt von einer statischen zu einer dynamischen Bibliothek geändert. Hier bringt er die gleiche Fehlermeldung in den Funktionen "daveReadISOPacket", "daveSendISOPacket" und "openSocket". Damit sind die Befehle "recv", "select", "send" und einige weitere gemeint. Das sollten meines Wissens nach Netzwerkbefehle sein.
> 
> ...


 
Hab bei mir auch die Makefiles für 2010 angepasst, und zwei Batchdateien zum compilieren geschrieben. Kann Ich dir morgen Online stellen (hab meinen Lappi auf der Baustelle vergessen!)


----------



## muhmann (31 August 2010)

pvbrowser schrieb:


> Du musst die wsock32 bzw. die neuere ws2_32 (kann auch Ipv6 usw.) mit angeben. Die die beiden Libs gehören zum Compiler. Die obigen funktionen gehören zur Socket Library.


Jetzt funktioniert es, vielen dank 
Ich dachte es würde ausreichen, die Header-Dateien einzubinden.

@Jochen Kühner
Ja das wäre super wenn Du die Online stellen könntest. Die Lösung über ein Visual Studio-Projekt funktioniert zwar, jedoch hätte ich schon gerne die Möglichkeit LibNoDave mit der Makefile und .bat Dateien zu erstellen.


----------



## Jochen Kühner (31 August 2010)

muhmann schrieb:


> @Jochen Kühner
> Ja das wäre super wenn Du die Online stellen könntest. Die Lösung über ein Visual Studio-Projekt funktioniert zwar, jedoch hätte ich schon gerne die Möglichkeit LibNoDave mit der Makefile und .bat Dateien zu erstellen.


 
jo, stells morgen online.

habe es auch schon mitels einem visual studio projekt compiliert, jedoch war bei mir dann die dll mehr als doppelt so groß und lief nur auf rechnern mit visual studio....


----------



## Jochen Kühner (1 September 2010)

Meine Batchfiles :

vcwinmake1.bat:

"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"

vcwinmake2.bat:

set PATH_TO_MAKE="C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\nmake"
%PATH_TO_MAKE% /f MAKEFILE.VC %1

makefile.vc:

#
# Makefile to build a Windows Version of LIBNODAVE using MSVC++ from Microsoft.
#
# type 'make' to build libnodave.dll and some statically linked test programs.
# type 'make dynamic' to make libnodave.dll and some dynamically linked test programs.
#
# The directory where the tools are:
#
VCPATH=d:\programme\microsoft visual C++ Toolkit 2003
SDKPATH=d:\programme\microsoft platform sdk

VCPATH=C:\Program Files\Microsoft Visual Studio 9.0\VC
SDKPATH=C:\Program Files\Microsoft SDKs\Windows\v6.0A


CC="$(VCPATH)\bin\cl"
LL="$(VCPATH)\bin\link"

CFLAGS= -I"$(VCPATH)\include" -I"$(SDKPATH)\include" -c -DBCCWIN -DDAVE_LITTLE_ENDIAN -TC
LFLAGS= /LIBPATH:"$(VCPATH)"\lib,"$(SDKPATH)"\lib
LLFLAGS = /LIBPATH:"$(VCPATH)\lib" /DEF:libnodave.DEF

PROGRAMS=testMPI.exe testPPI.exe testAS511.exe\
testPPI_IBH.exe testPPI_IBHload.exe testPPIload.exe \
testMPIload.exe testISO_TCP.exe testISO_TCPload.exe testIBH.exe testMPI_IBHload.exe \
testNLpro.exe testS7online.exe


DYNAMIC_PROGRAMS=testMPId.exe testPPId.exe testISO_TCPd.exe testIBHd.exe testPPI_IBHd.exe

LIBRARIES=libnodave.dll

all: $(LIBRARIES)

dynamic: $(DYNAMIC_PROGRAMS)

testISO_TCP.exe: nodave.obj openSocketw.obj testISO_TCP.obj
	$(LL) $(LFLAGS) testISO_TCP.obj openSocketw.obj nodave.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:testISO_TCP.exe
testMPI.exe: setportw.obj nodave.obj testMPI.obj
	$(LL) $(LFLAGS) setportw.obj nodave.obj testMPI.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:testMPI.exe
testIBH.exe: openSocketw.obj nodave.obj testIBH.obj 
	$(LL) $(LFLAGS) openSocketw.obj nodave.obj testIBH.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:testIBH.exe
testIBHd.exe: libnodave.dll testIBH.obj 
	$(LL) $(LFLAGS) testIBH.obj libnodave.lib /OUT:testIBHd.exe
testPPI_IBH.exe: openSocketw.obj nodave.obj testPPI_IBH.obj 
	$(LL) $(LFLAGS) openSocketw.obj nodave.obj testPPI_IBH.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:testPPI_IBH.exe
testPPI_IBHd.exe: libnodave.dll testPPI_IBH.obj
	$(LL) $(LFLAGS) testPPI_IBH.obj libnodave.lib /OUT:testPPI_IBHd.exe
testMPId.exe: libnodave.dll testMPI.obj
	$(LL) $(LFLAGS) testMPI.obj libnodave.lib /OUT:testMPId.exe
testPPI.exe: testPPI.obj nodave.obj setportw.obj 
	$(LL) $(LFLAGS) setportw.obj nodave.obj testPPI.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:testPPI.exe
testPPId.exe: libnodave.dll testPPI.obj
	$(LL) $(LFLAGS) testPPI.obj libnodave.lib /OUT:testPPId.exe
testISO_TCPd.exe: libnodave.dll testISO_TCP.obj
	$(LL) $(LFLAGS) testISO_TCP.obj libnodave.lib /OUT:testISO_TCPd.exe
testPPIload.exe: nodave.obj setportw.obj testPPIload.obj 
	$(LL) $(LFLAGS) setportw.obj nodave.obj testPPIload.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:testPPIload.exe
testMPIload.exe: nodave.obj setportw.obj testMPIload.obj 
	$(LL) $(LFLAGS) setportw.obj nodave.obj testMPIload.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:testMPIload.exe
testISO_TCPload.exe: nodave.obj  openSocketw.obj testISO_TCPload.obj 
	$(LL) $(LFLAGS) openSocketw.obj nodave.obj testISO_TCPload.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:testISO_TCPload.exe
testMPI_IBHload.exe: nodave.obj  openSocketw.obj testMPI_IBHload.obj 
	$(LL) $(LFLAGS) openSocketw.obj nodave.obj testMPI_IBHload.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:testMPI_IBHload.exe
testPPI_IBHload.exe: nodave.obj  openSocketw.obj testPPI_IBHload.obj
	$(LL) $(LFLAGS) openSocketw.obj nodave.obj testPPI_IBHload.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:testPPI_IBHload.exe
testAS511.exe: testAS511.obj nodave.obj setportw.obj
	$(LL) $(LFLAGS) setportw.obj nodave.obj testAS511.obj "$(SDKPATH)"\lib\ws2_32.lib /out:$@
testNLpro.exe: testNLpro.obj nodave.obj openSocketw.obj
	$(LL) $(LFLAGS) openSocketw.obj nodave.obj testNLpro.obj "$(SDKPATH)"\lib\ws2_32.lib /out:$@
libnodave.dll: nodave.obj setportw.obj openSocketw.obj openS7online.obj 
	$(LL) $(LLFLAGS) /DLL nodave.obj setportw.obj openSocketw.obj openS7online.obj "$(SDKPATH)"\lib\ws2_32.lib /OUT:libnodave.dll    
testS7online.exe: testS7online.obj nodave.obj openS7online.obj
	$(LL) $(LFLAGS) nodave.obj testS7online.obj openS7online.obj "$(SDKPATH)"\lib\ws2_32.lib "$(SDKPATH)"\lib\user32.lib /out:$@

#
# delete all but the sources:
#
clean: 	
	del /f /q *.tds *.il? *.obj *.map *.lib *.dll *.exe *.exp *.o *.a
distclean: 	
	del /f /q *.tds *.il? *.obj *.map

nodave.obj: nodave.c nodave.h
	$(CC) $(CFLAGS) -DDOEXPORT nodave.c
setportw.obj: setportw.c
	$(CC) $(CFLAGS) -DDOEXPORT setportw.c
openSocketw.obj: openSocketw.c
	$(CC) $(CFLAGS) -DDOEXPORT openSocketw.c
openS7online.obj: openS7online.c openS7online.h 
	$(CC) $(CFLAGS) -DDOEXPORT openS7online.c
s7fake.obj: s7fake.c
	$(CC) $(CFLAGS) -DDOEXPORT s7fake.c


----------



## muhmann (1 September 2010)

Danke Jochen.

Aber was mich stutzig macht, meine Dateien sind mit deinen absolut identisch. Mit dem Unterschied, dass ich anstatt VS 9.0, 10.0 benutze und das auch entsprechend als Pfad eingetragen habe. Ich kann die Dateien dennoch nicht erstellen 

Edit:
Ok, hat sich erledigt. Jetzt funktioniert es. Man muss die Visual Studio Eingabeaufforderung benutzen, erst dann funktioniert es.


----------



## Jochen Kühner (1 September 2010)

muhmann schrieb:


> Danke Jochen.
> 
> Aber was mich stutzig macht, meine Dateien sind mit deinen absolut identisch. Mit dem Unterschied, dass ich anstatt VS 9.0, 10.0 benutze und das auch entsprechend als Pfad eingetragen habe. Ich kann die Dateien dennoch nicht erstellen
> 
> ...



Entweder das, oder du rufst "vcvarsall.bat" von VS2010 auf!


----------



## muhmann (1 September 2010)

Lustigerweise hatte ich bereits vcvarsall.bat ausgeführt. Sogar mehrfach. Hat dennoch nicht funktioniert, nur in der VS Eingabeaufforderung funktionierte es. Womöglich ist bei der Installation von VS etwas schiefgelaufen, so dass er nicht alle Umgebungsvariablen korrekt setzen konnte, oder sowas in der Art


----------



## Ragnaroek18 (13 Dezember 2010)

*Syntax Error*

Hallo, 

Beschäftige mich gerade mit diesem Thema und habe jetzt die Quellcodes von Jochen übernommen.

Allerdings erhalte ich beim ausführen von vcwinmake2.bat folgende Meldung:



> MAKEFILE.VC(81) : fatal error U1034: Syntaxfehler: Trennzeichen fehlt
> Stop.



Weis da jemand rat? Ich kenne mich mit der Syntax von dem Makefile nicht aus.


----------



## Jochen Kühner (13 Dezember 2010)

Bei den Makefiles sind auch Tabs enthalten, diese sind wichtig...

Häng dir mal mein makefile hier an...


----------



## Ragnaroek18 (14 Dezember 2010)

Danke das hat mich ein kleines Stück weitergebracht.

Ich komme jetzt allerdings auf diese Ausgabe.

vcwinmake2.bat


> "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\cl" -I"C:\Pro
> gram Files (x86)\Microsoft Visual Studio 9.0\VC\include" -I"C:\Program Files (x8
> 6)\Microsoft SDKs\Windows\v7.0A\include" -c -DBCCWIN -DDAVE_LITTLE_ENDIAN -TC -D
> DOEXPORT nodave.c
> ...



vcwinmake1.bat gibt mir allerdings auch dieses aus:


> G:\Downloads\libnodave\libnodave>"G:\Program Files (x86)\Microsoft Visual Studio
> 10.0\VC\vcvarsall.bat"
> Setting environment for using Microsoft Visual Studio 2010 x86 tools.
> \PKWARE\pkzipc";C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;C:\P
> ...



Was stimmt jetzt schon wieder nicht?


----------



## Jochen Kühner (14 Dezember 2010)

Ragnaroek18 schrieb:


> Danke das hat mich ein kleines Stück weitergebracht.
> 
> Ich komme jetzt allerdings auf diese Ausgabe.
> 
> ...



Du musst halt mal sehen, ob die Pfade in dem Makefile überhaupt zu denen auf deinem System passen.


----------



## Ragnaroek18 (14 Dezember 2010)

> VCPATH=d:\programme\microsoft visual C++ Toolkit 2003
> SDKPATH=d:\programme\microsoft platform sdk
> 
> VCPATH=G:\Program Files (x86)\Microsoft Visual Studio 10.0\VC
> SDKPATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A



Also die letzten beiden Zeilen passen zu meinem System, habe ich angepasst.
Allerdings kann ich für die ersten beiden Zeilen keine passenden Einträge finden.

Muss ich die noch installieren?


----------



## Ragnaroek18 (14 Dezember 2010)

Scheint auch nicht zu funktionieren. Bekomme immer noch den gleichen Fehler.

Hab jetzt in einem anderen Forum gelesen:



> I got this error when I am using a 32 bit lib.
> I resolved this by setting the environment variable "lib" to point to a 64 bit lib dir as below.​ C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64​ set lib=C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64;your/other/lib​ hope this helps.​



Ich benutze auch ein win7 64 Bit. Wo muss ich dann den oben genannten Befehl einfügen um es auszuprobieren?

In den gleichen Forum wurde auch betont das vcvarsall.bat vorher ausgeführt werden muss. Aber das habe ich ja mit vcwinmake1.bat erledigt.


----------



## Jochen Kühner (14 Dezember 2010)

Unter Win64 hab Ich keine Erfahrung. Willst du den eine 64Bit Lib oder 32 Bit?

Bei 

VCPATH=G:\Program Files (x86)\Microsoft Visual Studio 10.0\VC
SDKPATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A

sind nur die letzten 2 Interessant, die ersten werden davon überschrieben (hab die nur nicht rausgelöscht!)


----------



## Ragnaroek18 (14 Dezember 2010)

Ich habe jetzt noch folgende Lösung gefunden

http://weblogs.sqlteam.com/mladenp/...dio-2008-install-bug-that-can-break-your.aspx

das könnte auch die komische Meldung in vcwinmake1.bat erklären.

Dann liegt es an meinem Dateipfad "[..]Program Files (x86)[..]" aufgrund der Klammer wird die .bat nich mehr richtig ausgeführt. Als eine Lösung steht dort die doppelten Anführungszeichen aus dem PATH zu entfernen. Jetzt weis ich allerdings nicht wo ich das machen kann. 
Vorschläge?

Den Ordnernamen kann ich leider nicht ändern da es sich um einen Systempfad handelt.


----------



## Ragnaroek18 (14 Dezember 2010)

Ich bin langsam echt am verzweifeln.

Den PATH konnte ich in den Umgebungsvariablen bei Windows ändern (indem ich die doppelten Anführungszeichen entfernt habe) danach lief vcvarsall.bat ohne Probleme durch. Und mit vcwinmake2.bat bin ich auch ein Stück weitergekommen. Allerdings hängt sich der Linker jetzt scheinbar an der testMPI.c auf. Hab diese Datei auch nochmal aus der unangetasteten libnodave version eingefügt, aber ohne Erfolg.


> testMPI.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_thi
> rds" in Funktion "_rBenchmark".
> testMPI.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_sec
> onds" in Funktion "_rBenchmark".
> ...



Langsam zerrt das Thema an den Nerven sitze nun schon 2 Tage dran.

Wäre super wenn ihr mir helfen könnt.


----------

