Seite 1 von 1
Qt und SnmpAPI
Verfasst: 14. Dezember 2009 15:25
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
Re: Qt und SnmpAPI
Verfasst: 14. Dezember 2009 16:40
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.
Verfasst: 14. Dezember 2009 16:45
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

Verfasst: 14. Dezember 2009 16:50
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?
Verfasst: 14. Dezember 2009 16:57
von ThorstenJLU
Nein

Immer wieder undefined reference
Verfasst: 15. Dezember 2009 07:34
von guenni81
Zeig mal deine .pro Datei.
Verfasst: 15. Dezember 2009 09:06
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
Verfasst: 15. Dezember 2009 09:58
von Mani99
Probiers mal mit
statt
und ich würde das leerzeichen aus "Linux Libs" rausnehmen und event einen unterstrich nehemen oder so!
Verfasst: 15. Dezember 2009 10:23
von ThorstenJLU
bringt leider auch nicht den gewünschten erfolg -.-
Verfasst: 15. Dezember 2009 12:24
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..
Verfasst: 15. Dezember 2009 13:30
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
Verfasst: 15. Dezember 2009 15:40
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....
Verfasst: 16. Dezember 2009 10:37
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.
Verfasst: 16. Dezember 2009 12:37
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...
Verfasst: 16. Dezember 2009 16:07
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 :
stürzt mir die Anwendung mit einem Fehler ab.
ich habe Pdu und target vorher überprüfen lassen mittels
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