paho.mqtt.cpp



  • @booster sagte in paho.mqtt.cpp:

    Oder muss ich die header aus dem src\mqtt Verzeichniss nehmen. Die sind nachwievor aber immer noch "falsch". Also ich meine die haben das mqtt\ Verzeichnis im #include stehen obwohl alle headers auf der selben ebene sind.

    ......./sonstwo/paho.mqtt.cpp/src/ zum Include-Path hinzufügen. Dann passen #includes mit mqtt/sonstwas.h.



  • @swordfish sagte in paho.mqtt.cpp:

    Dann passen #includes mit mqtt/sonstwas.h

    ja die meinen dann schon

    aber das Problem ist doch

    die headerdateien die in mqtt drin sind also z.B.
    async_client.h hat wiederum einen inlcude der wie folgt lautet

    #include "mqtt/types.h"

    obwohl ja async_client.h und types.h im selben Ordner sind.

    natürlich kann ich nun alle header Dateien durchgehen und dort das mqtt\ entfernen. Aber das ist doch nicht Sinn der Sache.



  • @booster sagte in paho.mqtt.cpp:

    aber das Problem ist doch
    die headerdateien die in mqtt drin sind also z.B.
    async_client.h hat wiederum einen inlcude der wie folgt lautet
    #include "mqtt/types.h"
    obwohl ja async_client.h und types.h im selben Ordner sind.

    Nein, das ist kein Problem.



  • Ja ok. Lag an was anderem dass er die Dateien nicht gefunden hat. Trotzdem gibt es Gründe wieso man das Verzeichnis nochmals angibt?



  • @booster sagte in paho.mqtt.cpp:

    Trotzdem gibt es Gründe wieso man das Verzeichnis nochmals angibt?

    Wie viele types.h mag es wohl in einem Projekt geben, das mehre Bibliotheken verwendet? mqtt/types.h dagegen wird es nicht so oft geben.



  • Es scheint aber doch ein Problem zu sein. Ich habe nun mal die gesamten Quellen in mein Projekt eingefügt.
    Und erhalte nun den Fehler:

    #include "mqtt/async_client.h"
    
    Cannot open include file: 'mqtt/async_client.h': No such file or directory	\paho.mqtt\mqtt\client.h	27
    

    entferne ich das mqtt/ funktioniert dieser include

    erhalte aber dann beim include von #include "mqtt/types.h" in async_client.h' den Fehler.

    Entferne ich nun bei allen includes das mqtt/ bekomme ich keine Fehler mehr.



  • @booster sagte in paho.mqtt.cpp:

    Es scheint aber doch ein Problem zu sein

    Das Problem sitzt vor deinem Computer.

    Deine Include-Pfade sind fehlerhaft.



  • @manni66 sagte in paho.mqtt.cpp:

    Das Problem sitzt vor deinem Computer.

    Das mag schon sein. Drum suche ich hier ja auch hilfe.

    @manni66 sagte in paho.mqtt.cpp:

    Deine Include-Pfade sind fehlerhaft.

    Wie ich bereits sagte habe ich nun anstatt die lib zu generieren das gesamte Source verzeichnis in mein Projekt rein gezogen.



  • Wie ich bereits gesagt habe, Du sollst die lib bauen, Dein Projekt dagegen linken und ..../sonstwo/paho.mqtt.cpp/src/ zum Include-Path hinzufügen.



  • @swordfish sagte in paho.mqtt.cpp:

    Wie ich bereits gesagt habe, Du sollst die lib bauen, Dein Projekt dagegen linken und ..../sonstwo/paho.mqtt.cpp/src/ zum Include-Path hinzufügen.

    Ja das habe ich gemacht. Allerdings erhalte ich dann etliche Linker fehler. Anscheinend bin ich da auch nicht der einzige denn es gibt bei github dazu schon einen issue

    https://github.com/eclipse/paho.mqtt.cpp/issues/121

    Der aber seit Juli 2017 offen ist ohne Lösungsvorschlag.

    Jetzt habe ich mich nach einem alternativen Lösungsweg umgeschaut. Und dieser ist Quellen ins eigene Projekt einfügen und selbst kompilieren. Funktioniert, aber nur mit Anpassung der der #include Anweisungen.

    Wenn mir jemand helfen kann die Linkerfehler weg zu bekommen auch recht.
    Trotzdem intertessiert es mich wieso es in einem Fall die header im selben Verzeichnis findet und im anderen Fall nicht.



  • @booster sagte in paho.mqtt.cpp:

    @manni66 sagte in paho.mqtt.cpp:

    Deine Include-Pfade sind fehlerhaft.

    Wie ich bereits sagte habe ich nun anstatt die lib zu generieren das gesamte Source verzeichnis in mein Projekt rein gezogen.

    Das ist kein Widerspruch.



  • Sorry steh ich auf dem Schlauch.

    Also in meinem Quellverzeichnis habe ich einen Ordner mit paho.mqtt angelegt darunter liegen dann die ganzen cpp.files und der besagte mqqt Ordner mit den headerfiles.

    Habe nun den ganzen Ordner via drag&drop in mein Projekt im Visual Studio rein gezogen.

    Um nun den mqtt client in meinem Code verwenden zu können includiere ich die header Datei wie folgt:

    #include "paho.mqtt/mqtt/client.h"

    muss ich nun trotzdem

    ..../sonstwo/paho.mqtt.cpp/src/ in mein Include-Path mit aufnehmen ?



  • Mach es doch einfach.



  • Habe ich ja auch gleich nach dem Post getan. Gut es funktioniert.

    Wieso ich dass machen muss ist mir aber noch nicht klar.
    Wenn ich das doch in mein Projekt rein ziehe ist das doch im Projekt drin und muss doch nicht auch noch im Include-path rein. ?

    -> Jetzt habe ich allerdings die selben Linker Fehler, als wenn ich die lib einbinde 😞



  • Das haben dir die beiden anderen doch schon erklärt. Um Konflikte mit anderen (evtl. gleichnamigen) Headerdateien zu vermeiden wird innerhalb der Library der Verzeichnisname noch angegeben (quasi wie ein namespace) und daher muß der Include-Pfad passend gesetzt sein.

    Und die Linkerfehler haben nichts mit dem Include zu tun, d.h. die Compilerphase ist erfolgreich durchgelaufen.
    Welche erhältst du denn? Ich nehme mal an, daß die MQTT-Lib noch andere Libs benötigt, welche du dann eben auch noch einbinden mußt ("Linker input" sowie "Linker paths").



  • This code requires the Paho C library by Ian Craggs, et al., specifically version 1.2.0 (Paho Release 1.3) or possibly later.

    Da zu dieser Lib keine Fragen auftauchen, hast du sie vermutlich nicht installiert.



  • @th69 sagte in paho.mqtt.cpp:

    Und die Linkerfehler haben nichts mit dem Include zu tun, d.h. die Compilerphase ist erfolgreich durchgelaufen.

    Das ist klar. Das habe ich ja auch nicht behauptet.

    @th69 sagte in paho.mqtt.cpp:

    Ich nehme mal an, daß die MQTT-Lib noch andere Libs benötigt, welche du dann eben auch noch einbinden mußt

    Ja, wie Manni erwähnt die Paho c library. Das habe ich allerdings getan.

    Linker Fehler sind eigentlich genau die selben die in dem angegebenen link zu dem issue in github auf dem zweiten Screenshot zu sehen sind.

    Also einer davon:

    unresolved external symbol _MQTTAsync_unsubscribeMany referenced in function "public: virtual class std::shared_ptr<class mqtt::token> __thiscall mqtt::async_client::unsubscribe(class std::shared_ptr<class mqtt::string_collection const >)" (?unsubscribe@async_client@mqtt@@UAE?AV?$shared_ptr@Vtoken@mqtt@@@std@@V?$shared_ptr@$$CBVstring_collection@mqtt@@@4@@Z)
    


  • Ohjee. übersehen

    paho.mqtt.c\lib\paho-mqtt3a.lib : warning LNK4272: library machine type 'x64' conflicts with target machine type 'x86'

    Denke das wird das Problem sein. Ich muss mein Projekt mit x86 also win32 kompilieren weil ich noch 2 weitere libs einbinde die nur in x86 zur Verfügung stehen.

    Die paho.mqtt.c library anscheinend nur in x64 Version.



  • Darf ich euch nochmals um Hilfe bitten.
    Die paho.mqtt.c library steht momentan also nur in der 64bit Version zur Verfügung.
    Das paho.mqtt.cpp Projekt stellt eine CMake Datei zur Verfügung die einem eine Visual Studio Solution erzeugt. Hier ist allerdings nur die win32 Plattform konfiguriert. ( Passt alles wunderbar zusammen 🙂 ) Also mit ein paar Hürden die Solution auf 64bit umgestellt und die paho.mqtt.cpp library erzeugt.

    Als nächstes habe ich dann ein kleines Consolenprojekt angelegt und darin dann beide librarys eingebunden.

    Nun ganz einfach mal eine Verbindung zum loakelen Broker herstellen:

    #include "stdafx.h"
    using namespace std;
    
    #include "mqtt/async_client.h"
    
    
    const std::string DFLT_SERVER_ADDRESS{ "tcp://localhost:1883" };
    const std::string DFLT_CLIENT_ID{ "async_publish" };
    
    int main()
    {
    	cout << "Initializing for server '" << DFLT_SERVER_ADDRESS << "'..." << endl;
    	mqtt::async_client client(DFLT_SERVER_ADDRESS, DFLT_CLIENT_ID);
    }
    

    Code kompiliert. Aber wenn ich starten will beendet sich mein Programm sofort wieder (main wird nicht aufgerufen)

    Ausgabe:

    "MyMqttTestClient.exe" (Win32): "D:\Projekte\MyMqttTestClient\x64\Debug\MyMqttTestClient.exe" geladen. Symbole wurden geladen.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\ntdll.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\kernel32.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\KernelBase.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\sysfer.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\msvcp140d.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\vcruntime140d.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\ucrtbased.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\api-ms-win-core-localization-l1-2-0.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\api-ms-win-core-processthreads-l1-1-1.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\api-ms-win-core-file-l1-2-0.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\api-ms-win-core-timezone-l1-1-0.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\api-ms-win-core-file-l2-1-0.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    "MyMqttTestClient.exe" (Win32): "C:\Windows\System32\api-ms-win-core-synch-l1-2-0.dll" geladen. PDB-Datei wurde nicht gefunden oder konnte nicht geöffnet werden.
    Das Programm "[11748] MyMqttTestClient.exe" wurde mit Code -1073741515 (0xc0000135) 'Es wurde keine abhängige DLL gefunden' beendet.
    

    Was fehlt mir hier?



  • Die PDB-Warnungen kannst du ignorieren, aber die letzte Zeile ist entscheidend: es findet eine DLL nicht.

    Kopiere die DLLs (deine gebauten Libraries) in das Verzeichnis des Konsolenprogramms.

    Wenn das auch nicht reicht, dann benutze den DependencyWalker und öffne die EXE damit - es wird dann rot markieren, welche (abhängigen) DLLs noch fehlen.


Anmelden zum Antworten