Qt und SnmpAPI

Alles rund um die Programmierung mit Qt
Antworten
ThorstenJLU
Beiträge: 8
Registriert: 14. Dezember 2009 14:47

Qt und SnmpAPI

Beitrag von ThorstenJLU »

Hi Leute,

ich sitze momentan an dem "delikaten" Problem unter Qt eine GUI zu schreiben, die per Snmp mit einem PowerSupply kommuniziert. Im Grunde benötige ich nur einen Set und einen Get Befehl.

Aber die Schwierigkeiten fangen ganz am Anfang an. Ich habe Qt4 (2009.04) mit MinGW Umgebung und benutzt Eclipse von Trolltech. Alle sunter Win2000.

Ich habe bereits probiert :

Net-Snmp : Leider ist es nicht möglich die Header einzubinden, selbst der Weg mit extern "C"{} fürhrt nicht zum erfolg, selbst wenn ich alle 'typedef' auskommentiere gibt es folgende fehlermeldung :
../net-snmp-dev/net-snmp/library/container.h: In function `int CONTAINER_FREE(netsnmp_container*)':
../net-snmp-dev/net-snmp/library/container.h:427: error: netsnmp_free' was not declared in this scope
../net-snmp-dev/net-snmp/library/container.h:427: warning: unused variable 'netsnmp_free'
Snmp++ von Agent++ :
Ich kann die original Source nicht kompilieren um sie entweder als Lib einzubinden oder aber direkt ins Projekt einzubinden. Fehlermeldung :
../projects/snmp++/src/msec.cpp:257: error: `localtime_r' was not declared in this scope
Habe auch eine unter Linux kompilierte libsnmp++.a ausprobiert per LIBS+= -lsnmp++ einzubinden, bekomme dabei aber immer 'undefined reference'.

Bin momentan mit meinem Latein ziemlich am Ende.

Vielleicht weiß eine rvon euch ja Rat
Grüße
Thorsten
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Re: Qt und SnmpAPI

Beitrag von guenni81 »

ThorstenJLU hat geschrieben:Habe auch eine unter Linux kompilierte libsnmp++.a ausprobiert per LIBS+= -lsnmp++ einzubinden, bekomme dabei aber immer 'undefined reference'.
Hier fehlt vermutlich noch der Pfad zu der libsnmp Library. Hier einfach ein
LIBS += -L"/Pfad/zur/lib" -lsnmp++
hinzufügen.
mfg
Günni
ThorstenJLU
Beiträge: 8
Registriert: 14. Dezember 2009 14:47

Beitrag von ThorstenJLU »

Das gepostete war jetzt die letzte Einstellung, da hatt eich probiert die .a direkt in den lib Ordner von MinGW zu kopieren, habe normal den Pfad mit drinnen, qmake spuckt auch keinen Fehler an der Stelle aus :)
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Beitrag von guenni81 »

ThorstenJLU hat geschrieben:Das gepostete war jetzt die letzte Einstellung, da hatt eich probiert die .a direkt in den lib Ordner von MinGW zu kopieren, habe normal den Pfad mit drinnen, qmake spuckt auch keinen Fehler an der Stelle aus :)
Funktioniert dies nun so wie es soll?
mfg
Günni
ThorstenJLU
Beiträge: 8
Registriert: 14. Dezember 2009 14:47

Beitrag von ThorstenJLU »

Nein :( Immer wieder undefined reference
guenni81
Beiträge: 134
Registriert: 29. Juli 2006 02:22

Beitrag von guenni81 »

Zeig mal deine .pro Datei.
mfg
Günni
ThorstenJLU
Beiträge: 8
Registriert: 14. Dezember 2009 14:47

Beitrag von ThorstenJLU »

Code: Alles auswählen

TEMPLATE = app
TARGET = SnmpTest
QT += core \
    gui
LIBS += -L"D:\projects\includes\Linux Libs" -lsnmp++
INCLUDEPATH += D:\projects\includes
HEADERS += snmptest.h
SOURCES += snmptest.cpp \
		   main.cpp	
FORMS += snmptest.ui
RESOURCES += 
Ín der Dokumentation von qmake steht ja, dass das verlinken mit Libs nur funktioniert wenn die Lib gefunden wird, sonst gibt der Linke reinen fehler aus. Und diese Fehlermeldung bekomme ich nicht......meine libsnmp++.a und libsnmp++.so liegen beide jeweils in dem Ordner D:\projects\includes\Linux Libs
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Probiers mal mit

Code: Alles auswählen

INCLUDEPATH=D:\projects\includes 
statt

Code: Alles auswählen

INCLUDEPATH += D:\projects\includes 
und ich würde das leerzeichen aus "Linux Libs" rausnehmen und event einen unterstrich nehemen oder so!
ThorstenJLU
Beiträge: 8
Registriert: 14. Dezember 2009 14:47

Beitrag von ThorstenJLU »

bringt leider auch nicht den gewünschten erfolg -.-
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

@guenni81: wenn der Pfad fehlen würde, gäbe es kein "undefined reference". Dann würde der Linker die Library nicht finden und mit einer entsprechenden Fehlermeldung abbrechen.

@Mani99: INCLUDEPATH ist für den Compiler. Thorsten hat ein Linker-Problem

@ThorstenJLU: Zeig mal die komplette Konsolenausgabe (Linkeraufruf plus sämtliche Fehlermeldungen). Sonst raten hier nur alle herum..
ThorstenJLU
Beiträge: 8
Registriert: 14. Dezember 2009 14:47

Beitrag von ThorstenJLU »

So neue Updates...habe jetzt im Internet einen Beitrag gefunden, wie man mit Qt die snmp++ source kompilieren kann. Mann muss ein paar #defines ausklammern, da der mingw sonst aufgrund der gcc Einträge in die unix sektionen springt.

Jetzt bekomm eich, wenn ich die erstellte statische Bibliothek verlinke folgendes :

Code: Alles auswählen

../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xa0): undefined reference to `select@20'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x153): undefined reference to `inet_addr@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x16c): undefined reference to `htons@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x19f): undefined reference to `sendto@24'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x28f): undefined reference to `recvfrom@24'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x309): undefined reference to `inet_ntoa@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x32d): undefined reference to `ntohs@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x61f): undefined reference to `recvfrom@24'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x6b4): undefined reference to `inet_ntoa@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x6d8): undefined reference to `ntohs@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xabb): undefined reference to `WSAStartup@8'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xc6d): undefined reference to `socket@12'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xca2): undefined reference to `inet_addr@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xcc8): undefined reference to `htons@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xce8): undefined reference to `bind@12'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xd3a): undefined reference to `setsockopt@20'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xd47): undefined reference to `WSAGetLastError@0'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xd8c): undefined reference to `WSAGetLastError@0'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xdd2): undefined reference to `closesocket@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x53b3): undefined reference to `closesocket@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x5533): undefined reference to `closesocket@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x56b3): undefined reference to `closesocket@4'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x6594): undefined reference to `select@20'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0x65b9): undefined reference to `__WSAFDIsSet@8'
../include/libsnmp_pp.a(uxsnmp.o):uxsnmp.cpp:(.text+0xad5): undefined reference to `WSACleanup@0'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x165a): undefined reference to `htonl@4'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x17bf): undefined reference to `gethostbyname@4'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x17e0): undefined reference to `inet_ntoa@4'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x1887): undefined reference to `WSAGetLastError@0'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x1b01): undefined reference to `inet_addr@4'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x1b3c): undefined reference to `gethostbyaddr@12'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x1c47): undefined reference to `WSAGetLastError@0'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x1d07): undefined reference to `ntohl@4'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x1d37): undefined reference to `htonl@4'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x2184): undefined reference to `htons@4'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x21b7): undefined reference to `htons@4'
../include/libsnmp_pp.a(address.o):address.cpp:(.text+0x2925): undefined reference to `ntohs@4'
../include/libsnmp_pp.a(eventlistholder.o):eventlistholder.cpp:(.text+0x493): undefined reference to `select@20'
../include/libsnmp_pp.a(eventlistholder.o):eventlistholder.cpp:(.text+0x660): undefined reference to `select@20'
../include/libsnmp_pp.a(msgqueue.o):msgqueue.cpp:(.text+0x4ef3): undefined reference to `__WSAFDIsSet@8'
../include/libsnmp_pp.a(msgqueue.o):msgqueue.cpp:(.text+0x509e): undefined reference to `__WSAFDIsSet@8'
../include/libsnmp_pp.a(notifyqueue.o):notifyqueue.cpp:(.text+0x118d): undefined reference to `__WSAFDIsSet@8'
../include/libsnmp_pp.a(notifyqueue.o):notifyqueue.cpp:(.text+0x16bc): undefined reference to `closesocket@4'
../include/libsnmp_pp.a(notifyqueue.o):notifyqueue.cpp:(.text+0x29ab): undefined reference to `socket@12'
../include/libsnmp_pp.a(notifyqueue.o):notifyqueue.cpp:(.text+0x2aa4): undefined reference to `inet_addr@4'
../include/libsnmp_pp.a(notifyqueue.o):notifyqueue.cpp:(.text+0x2b39): undefined reference to `htons@4'
../include/libsnmp_pp.a(notifyqueue.o):notifyqueue.cpp:(.text+0x2b70): undefined reference to `bind@12'
../include/libsnmp_pp.a(notifyqueue.o):notifyqueue.cpp:(.text+0x3069): undefined reference to `closesocket@4'
../include/libsnmp_pp.a(notifyqueue.o):notifyqueue.cpp:(.text+0x3482): undefined reference to `WSAGetLastError@0'
../include/libsnmp_pp.a(notifyqueue.o):notifyqueue.cpp:(.text+0x34c2): undefined reference to `WSAGetLastError@0'
../include/libsnmp_pp.a(snmpmsg.o):snmpmsg.cpp:(.text+0x1a93): undefined reference to `gethostname@8'
../include/libsnmp_pp.a(snmpmsg.o):snmpmsg.cpp:(.text+0x1b09): undefined reference to `inet_addr@4'
make[1]: Leaving directory `D:/projects/SnmpTest'
../include/libsnmp_pp.a(snmpmsg.o):snmpmsg.cpp:(.text+0x34de): undefined reference to `inet_ntoa@4'
collect2: ld returned 1 exit status
make[1]: *** [debug\SnmpTest.exe] Error 1
make: *** [debug] Error 2
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

das dachte ich mir... die ungeloesten Referencen kommen nicht von deinem Programm, sondern von der Library selbst... schreib mal "QT += network" in deine pro-Datei....
ThorstenJLU
Beiträge: 8
Registriert: 14. Dezember 2009 14:47

Beitrag von ThorstenJLU »

Bringt leider auch nichts. Ich kann weder die Source zu einer dll kompilieren noch die staticlib in meinem Projekt nutzen.

Wenn ich kompiliere klappt die *.a noch fehlerfrei aber die *.dll erzeugt unerfüllte Referenzen und wenn ich die *.a in mein Projekt verlinke passiert das gleiche.

Auch mit QT += network.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Es ist nicht sonderlich schoen, wenn eine Applikation die fehlenden Referencen einer Library beheben muss... der saubere Weg waere, wenn die Library die Abhaengigkeiten selbst aufloest. Ich bin kein Windows-Hacker aber die MSDN verraet (http://msdn.microsoft.com/en-us/library ... S.85).aspx), dass die fehlenden Referencen in "Ws2_32.dll" definiert sind.
Ich wuerde daher versuchen, dem Linkeraufruf von snmp++ noch ein "-lWs2_32" hinzu zu fuegen. Oder die Referencen halt (weniger sauber) in der Applikation selbst aufloesen (LIBS += -lWs2_32)...

hth..


[EDIT]
Das hat uebrigens alles rein gar nichts mit Qt zu tun...
ThorstenJLU
Beiträge: 8
Registriert: 14. Dezember 2009 14:47

Beitrag von ThorstenJLU »

So. Ich habe jetzt die Bibliothek kompilieren können.

Das verlinken der libws2_32.a hats möglich gemacht ^^

Es ist in der Tat kein Qt Problem. Ich hab bei der ganzen Suche herausgefundne, dass diese Bibliothek nur für linux, bcc und MSVC vorgesehen ist und mann mit dem MinGw eben in die Unix Sektionen rutscht. Man muss die Config Datei anpassen und die Unix #defines auskommentieren.

Jetzt folgt sogleich das nächste Problem.....alles funktioniert wunderbar, Snmp lässt sich starten, ich kann die Klassen benutzen....aber :

Wenn ich ein snmp-get rausschicke, mit dem Befehl aus der Dokumentation :

Code: Alles auswählen

status = snmp->get(pdu, *target)
stürzt mir die Anwendung mit einem Fehler ab.

ich habe Pdu und target vorher überprüfen lassen mittels

Code: Alles auswählen

.valid()
auch ganz nach Doku.....daran wird es wohl nicht liegen.
drwatson32 verrät

Code: Alles auswählen

Funktion: RtlEnterCriticalSection
        77887ee0 648b0d18000000   mov     ecx,fs:[00000018]      fs:00000018=????????
        77887ee7 8b542404         mov     edx,[esp+0x4]          ss:00cc8503=fffed485
FEHLER ->77887eeb 837a1400         cmp   dword ptr [edx+0x14],0x0 ds:00a99eea=c70aeb00
        77887eef 754f             jnz     RtlDestroyAtomTable+0x58 (77896f40)
        77887ef1 f0ff4204         lock   inc dword ptr [edx+0x4] ds:00a99eeb=85c70aeb
        77887ef5 7519        jnz RtlQueryProcessBackTraceInformation+0x1d4 (77890a10)
        77887ef7 8b4124           mov     eax,[ecx+0x24]         ds:80a77ee6=????????
        77887efa 89420c           mov     [edx+0xc],eax          ds:00a99eea=c70aeb00
        77887efd c7420801000000   mov    dword ptr [edx+0x8],0x1 ds:00a99eea=c70aeb00
        77887f04 33c0             xor     eax,eax
        77887f06 c20400           ret     0x4
        77887f09 8da42400000000   lea     esp,[esp]              ss:0022e61c=6915bb94
        77887f10 8b4124           mov     eax,[ecx+0x24]         ds:80a77ee6=????????
        77887f13 39420c           cmp     [edx+0xc],eax          ds:00a99eea=c70aeb00

*----> Stack Back Trace <----*

FramePtr ReturnAd Param#1  Param#2  Param#3  Param#4  Function Name
0022E628 6916349B 00000000 6917071C 0022E64C 69143308 ntdll!RtlEnterCriticalSection 
0022E658 69167193 09059B08 000000A1 0022F930 0022F8E0 !ZN4Snmp11MyMakeReqIdEv 
0022F9B8 691685DE 09059B08 0022FAD0 00000000 00000000 !ZN4Snmp11snmp_engineER3PdullRK10SnmpTargetPFviPS_S1_RS2_PvEPKvii 
0022F9E8 00403418 09059B08 0022FAD0 090519B0 0040164E !ZN4Snmp8get_nextER3PduRK10SnmpTargetPFviPS_S1_RS2_PvEPKv 
0022FD68 0040146A 0022FDD0 00000000 086D4C20 00040503 !<nosymbols> 
0022FE18 004041B1 00000001 086D4C20 086D4CB8 0000000A !<nosymbols> 
0022FEF8 00403C9C 00400000 00000000 00233A81 0000000A !<nosymbols> 
0022FF78 0040124B 00000001 086D4168 086D29D8 00412000 !<nosymbols> 
0022FFB0 004012B8 00000002 00000009 0022FFF0 77E989D5 !<nosymbols> 
0022FFC0 77E989D5 00000000 00233BB8 7FFDF000 C0000005 !<nosymbols> 
0022FFF0 00000000 004012A0 00000000 000000C8 00000100 kernel32!ProcessIdToSessionId 
dass es wohl hier eine Zugriffsverletzung auf die Netzwerkressource gibt..naja.

Aber da das jetzt wohl in ein anderes Forum gehört trotzdem vielen Dank an alle, mein ursprüngliches Problem hat sich gelöst.

Grüße
Thorsten
Antworten