Visual Studio 2019 libwebsocket Linker error



  • Hallo Leute,

    ich komme leider nicht weiter. Bekomme die Linker Fehler nicht gelöst.

    Habe versucht die libwebsocket library für Windows Visual Studio zu bauen. Klappt aber nicht wirklich. Habs versucht nach dieser Anleitung zu bauen: https://libwebsockets.org/lws-api-doc-master/html/md_README_8build.html

    Repository zur libwebsocket library: https://github.com/dmikushin/libwebsockets/tree/7e1033671787300277e880d46d64a7ad27f4a09e

    Es sehe aber nirgendwo .libs, die generiert werden, die ich in Visual Studio einbinden kann.

    Ich hoffe jemand kann das lösen. Ich packe das Projekt in den Anhang.

    Es wäre super, wenn mir jemand das baufähige Projekt mit den richtigen Einstellungen und gebauten Bilbiotheken zur Verfügung stellen kann oder mir genau sagt, was ich wo einfügen soll, damit das Projekt kompilliert.

    Danke euch.

    Link zum Visual Studio Projekt: https://www.file2send.eu/de/download/aqnuNgZYxM8CTSLAF8LNeC4uhctHfIzxdtP3zSDzjxfFoSjBRUiqJBuyljXCKid8

    #include <iostream>
    #include <libwebsockets.h>
    
    static lws_context* context = NULL;
    
    int main()
    {
    	// Connect if we are not connected to the server.
    	lws_client_connect_info ccinfo = { 0 };
    
    	ccinfo.host = lws_canonical_hostname(context);
    
    	lws* conn = lws_client_connect_via_info(&ccinfo);
    }
    
    1>ConsoleApplication1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_lws_canonical_hostname" in Funktion "_main".
    1>ConsoleApplication1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_lws_client_connect_via_info" in Funktion "_main".
    


  • @des1re10 sagte in Visual Studio 2019 libwebsocket Linker error:

    1>ConsoleApplication1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_lws_canonical_hostname" in Funktion "_main".
    1>ConsoleApplication1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_lws_client_connect_via_info" in Funktion "_main".
    

    Okay, also wenn ich das richtig verstehe, wurde die Bibliothek selbst anscheidend korrekt gebaut und es gibt nur Probleme mit dem einbinden (?). ConsoleApplication1.obj sieht mir doch eher nach deinem eigenen Projekt aus - oder verstehe ich as falsch?

    Erstmal: Wurde die Bibliothek (nach Anleitung) fehlerfrei gebaut? Gab es da Meldungen?

    Dann: Die .lib, .a, .dlloder .so-Dateien, die dabei erstellt werden, befinden sich nach dem Build der Bibliothek für gewöhnlich in einem Verzeichnis unterhalb der .sln-Datei oder des Makefile, das CMake erstellt hat.

    Die kann man sich da manuell rausfischen. Der reguläre Weg, an die Dateien zu kommen ist jedoch, das install-Target zu bauen. Entweder mit make install oder in der VS-Solution das Projekt INSTALL (so heisst es gaube ich) auszuführen. Dabei werden alle zum einbinden der Bibliothek benötigten Dateien (.lib/.dll/Header) in das Verzeichnis kopiert, das in der CMake-Variable CMAKE_INSTALL_PREFIX konfiguriert wurde.

    Wichtig: Stell sicher, dass du bei der Konfiguration er Bibliothek diese Variable auf jeden Fall auf ein sinnvolles Verzeichnis gesetzt hast. Z.B. via cmake -DCMAKE_INSTALL_PREFIX:PATH=C:/meinprojekt/libwebsocket in der Kommandozeile oder in der CMake-GUI entsprechend eingetragen. Der Default-Pfad, der verwendet wird, wenn man nichts angibt, ist nämlich soweit ich weiss C:/Program Files/$<PROJECT_NAME> oder sowas. Da will man die Dateien ziemlich sicher nicht drin haben! Erst recht nicht zum Entwickeln.

    Wenn du die Dateien dann an einer bekannten Stelle liegen hast, musst du in VS natürlich die Pfade enstprechend konfigurieren (Include/Library-Pfade) und angeben, dass du gegen die entsprechende Import- oder statische Bibliothek linken willst. Eine eventuelle .dll sollte der Einfachheit halber auch noch in das Verzeichnis kopiert werden, in dem sich deine eigene .exe-Datei befindet, nachdem sie erstellt wurde - sonst gibts eventuell Probleme beim Ausführen.



  • Danke dir für die Rückmeldung.

    Ich habe die Bibliotheken über die Visual Studio Developer Console gebaut, hat er scheinbar auch einwandfrei durchgebaut.

    Dann ist ein Visual Studio Projekt entstanden (scheinbar um die Bibliotheken dann für Visual Studio bauen zu können). Das habe ich ausgeführt und dann tonnenweise Buildfehler bekommen.

    In der Anleitung steht auch, dass ich angeblich verschiedene .libs einbinden soll. (iphlpapi.lib, psapi.lib, userenv.lib) Dazu hatte ich in einer anderen Quelle noch gefunden, dass ich das Windows SDK brauche. Das habe ich dann installiert.

    Es sind einfach zu viele Fehlerquellen. Ich bekomme die Bibliotheken also schon nicht wirklich gebaut.

    Edit: diesen Befehl gebe ich ein zum Bauen der Bibliotheken in der Visual Studio Developer Console: D:\workspace\Visual Studio\Libraries\libwebsockets>cmake -G "Visual Studio 16"

    Dann entsteht das .sln Projekt, das ich öffne mit Visual Studio. Dann gibt es im Projektmappen Explorer einen Eintrag mit ALL_BUILD, wenn ich den ausführe, kommen sehr viele Fehlermeldungen.

    Wäre es möglich, dass mir jemand die Bibliotheken gebaut zusammen mit dem Projekt bereitstellt? Das wäre klasse

    ...
    6>D:\workspace\Visual Studio\Libraries\libwebsockets\test-apps\test-server.c(46,26): error C2079: "fops_plat" verwendet undefiniertes struct "lws_plat_file_ops"
    6>D:\workspace\Visual Studio\Libraries\libwebsockets\test-apps\test-server.c(169,1): error C2061: Syntaxfehler: Bezeichner "test_server_fops_open"
    6>D:\workspace\Visual Studio\Libraries\libwebsockets\test-apps\test-server.c(169,1): error C2059: Syntaxfehler: ";"
    6>D:\workspace\Visual Studio\Libraries\libwebsockets\test-apps\test-server.c(169,54): error C2059: Syntaxfehler: "<parameter-list>"
    6>D:\workspace\Visual Studio\Libraries\libwebsockets\test-apps\test-server.c(580,28): warning C4013: "lws_get_fops" undefiniert; Annahme: extern mit Rückgabetyp int
    6>D:\workspace\Visual Studio\Libraries\libwebsockets\test-apps\test-server.c(580,14): error C2100: Ungültige Dereferenzierung.
    6>D:\workspace\Visual Studio\Libraries\libwebsockets\test-apps\test-server.c(582,25): error C2223: Der linke Teil von "->open" muss auf eine Struktur/Union zeigen
    6>D:\workspace\Visual Studio\Libraries\libwebsockets\test-apps\test-server.c(582,53): error C2065: "test_server_fops_open": nichtdeklarierter Bezeichner
    6>D:\workspace\Visual Studio\Libraries\libwebsockets\test-apps\test-server.c(588,15): warning C4013: "gettimeofday" undefiniert; Annahme: extern mit Rückgabetyp int
    6>getopt.c
    6>getopt_long.c
    5>LINK : fatal error LNK1104: Datei "lib\Debug\websockets_static.lib" kann nicht geöffnet werden.
    6>gettimeofday.c
    5>Die Erstellung des Projekts "test-lejp.vcxproj" ist abgeschlossen -- FEHLER.
    4>getopt.c
    4>getopt_long.c
    4>gettimeofday.c
    6>Code wird generiert...
    6>Die Erstellung des Projekts "test-server.vcxproj" ist abgeschlossen -- FEHLER.
    4>Code wird generiert...
    4>LINK : fatal error LNK1104: Datei "lib\Debug\websockets_static.lib" kann nicht geöffnet werden.
    4>Die Erstellung des Projekts "test-client.vcxproj" ist abgeschlossen -- FEHLER.
    7>------ Erstellen gestartet: Projekt: ALL_BUILD, Konfiguration: Debug x64 ------
    7>Building Custom Rule D:/workspace/Visual Studio/Libraries/libwebsockets/CMakeLists.txt
    ========== Erstellen: 2 erfolgreich, 5 fehlerhaft, 0 aktuell, 0 übersprungen ==========
    


  • @des1re10 Ich habe das mal kurz angetestet. Ich würde dir empfehlen, das CMake-GUI zu verwenden, wenn du ohnehin unter Windows und für VS arbeitest. Da sieht man m.E. ein wenig besser, was es für CMake-Variablen gibt.

    Das erste, das mir aufgefallen ist, ist dass libwebsockets eine SSL-Bibliothek benötigt, wenn man sie mit SSL-Unterstützung bauen will. Das ist per Default aktiv und wahrscheinlich die Hauptursache für deine Probleme. Es werden wohl eine ganze Reihe von SSL-Bibliotheken unterstützt. Wenn man im CMake-GUI nach "SSL" sucht, findet man schnell die entsprechenden Variablen. Ich habe hier keine fertig gebaute SSL-Lib zur Hand und hatte auch nicht den Nerv, zuerst noch eine zu bauen, daher habe ich die SSL-Unterstützung deaktiviert mit LWS_WITH_SSL=OFF, bzw. -DLWS_WITH_SSL:BOOL=OFF, wenn man es via Kommandozeile einstellen will.

    Dann habe ich CMAKE_INSTALL_PREFIX auf das Verzeichnis gesetzt, wo ich die fertig gebaute Lib gerne hätte und mir die .sln-Datei und die zugehörigen Projekte generieren lassen.

    Die Solution habe ich dann geöffnet und erstmal nur das Projekt websockets gebaut, da ich vermutete, dass es sich dabei um die statische Bibliothek handelt. Dabei traten ein paar Fehler auf, die nahelegen, dass die Entwickler der Bibliothek den Visual Studio Build wohl nicht allzu oft testen:

    libwebsockets\lib\roles\mqtt\mqtt.c:

    1771    uint32_t __attribute__((unused)) tops;
    
    1>libwebsockets\lib\roles\mqtt\mqtt.c(1771,25): error C2143: syntax error: missing ')' before '('
    1>libwebsockets\lib\roles\mqtt\mqtt.c(1771,32): error C2059: syntax error: ')'
    1>libwebsockets\lib\roles\mqtt\mqtt.c(1771,33): error C2059: syntax error: ')'
    1>libwebsockets\lib\roles\mqtt\mqtt.c(1771,35): error C2146: syntax error: missing ')' before identifier 'tops'
    1>libwebsockets\lib\roles\mqtt\mqtt.c(1771,35): error C2091: function returns function
    1>libwebsockets\lib\roles\mqtt\mqtt.c(1771,35): error C2146: syntax error: missing ';' before identifier 'tops'
    1>libwebsockets\lib\roles\mqtt\mqtt.c(1771,39): error C2065: 'tops': undeclared identifier
    

    ... und entsprechende Folgefehler. Das liegt einfach daran, dass __attribute__((unused)) ein GCC und Clang-spezifisches Feature ist. Damit lassen sich Warnungen unterdrücken, dass die Variable zwar deklariert wurde, aber nicht verwendet wird. Nichts dramatisches also.

    Ich habe diese GCC-spezifischen Attribute einfach in den Zeilen 1771 und 1936 der Datei libwebsockets\lib\roles\mqtt\mqtt.c entfernt, so dass die Zeilen dann nur noch so aussahen:

    uint32_t tops;
    

    Damit liess sich dann das Projekt libwebsockets problemlos bauen. Ebenso die anderen Projekte, inklusive dem INSTALL-Projekt. Letzteres hat mir dann die Bibliotheks-Dateien in das Verzeichnis kopiert, das ich in CMAKE_INSTALL_PREFIX agegeben hatte: Die Header, die .lib-Dateien und die DLL.

    Ich denke das solltest du jetzt auch so hinbekomen. Wenn du SSL-Support haben möchtest, musst du dich noch für eine SSL-Library entscheiden, diese ebenfalls bauen und dem CMake-Build-Skript mitteilen, wo es diese finden kann (siehe SSL-Variablen in der CMake-GUI, da kann man für jede SSL-Lib INCLUDE_DIRS und LIBRARIES angeben).

    Das sind übrigens typische Probleme, die immer mal wieder auftreten, wenn man Bibliotheken baut. Besonders wenn man unter Windows mit VS baut und die Entwickler selbst vornehmlich unter unixoiden Systemen mit GCC oder Clang arbeiten. An sowas kannst du dich also schonmal gewöhnen, wenn du sowas öfter machen willst. Da muss man nicht selten schonmal selbst Hand an den Code legen und selbst herausfinden, was da jetzt genau schiefläuft - oft sind es aber auch nur so Kleinigkeiten wie hier.



  • Dieser Teil hat funktioniert ja, ich muss aber sämtliche Bibliotheken einwandfrei durchbauen können. In meinem Hauptprojekt treten sonst weitere Linkerfehler auf.

    Nur die websockets static lib reicht nicht.

    OpenSSL brauche ich, habe ich heruntergeladen, Bibliotheken sind auch drin. Wurde auch alles in den Cmake Einstellungen verlinkt.

    2 Einstellungen scheinen aber zu fehlen (in der Cmake GUI):
    LIBEAY_BIN-NOTFOUND und SSLEAY_BIN-NOTFOUND
    Welche Dateien werden hier verlangt?

    Wenn ich Build All ausführe, treten zu viele Fehler auf. Das muss funktionieren und alle Libraries müssen einwandfrei generiert werden. (Nur libwebsockets zu bauen klappt bei mir jetzt scheinbar auch, mit dieser Dateimodifikation, die du meintest)

    Danke dir.



  • @des1re10 sagte in Visual Studio 2019 libwebsocket Linker error:

    OpenSSL brauche ich, habe ich heruntergeladen, Bibliotheken sind auch drin. Wurde auch alles in den Cmake Einstellungen verlinkt.

    Gut, dass du eine bereits gebaute Version von OpenSSL hast. Das ist nämlich ein ziemlich Moloch, wenn ich mich recht erinnere. Das ist kein Spass sowas zu bauen 😉

    2 Einstellungen scheinen aber zu fehlen (in der Cmake GUI):
    LIBEAY_BIN-NOTFOUND und SSLEAY_BIN-NOTFOUND
    Welche Dateien werden hier verlangt?

    SSLEAY ist eine andere SSL-Implementierung wie OpenSSL, WolfSSL oder mbedSSL. Wenn du bereits OpenSSL verwendest, dann würde ich vermuten, dass du speziell diese Meldungen ignorieren kannst.

    Wenn ich Build All ausführe, treten zu viele Fehler auf. Das muss funktionieren und alle Libraries müssen einwandfrei generiert werden. (Nur libwebsockets zu bauen klappt bei mir jetzt scheinbar auch, mit dieser Dateimodifikation, die du meintest)

    Da kann ich wenn überhaupt nur mit den konkreten Fehlermeldungen weiterhelfen. Du solltest da systematsich vorgehen. Mach nicht gleich BUILD_ALL sondern bau erstmal nur mit dem websockets-Projekt in der Solution die statische Bibliothek. Das Projekt wird wohl alle wichtigen Quellcodedateien einmal kompilieren und als statische Bibliothek auch keine Linker-Fehler produzieren. Erstmal nur einzene Projekte in der Solution zu bauen hilft, die Fehler etwas einzugrenzen.

    Schau dir die Fehler an und versuche sie zu verstehen. Insbesondere auch das Output-Tab von VS. Wenn du nicht weiter weisst mit einem Fehler, dann poste die Meldung nochmal hier. Vielleicht habe ich dann eine Idee, woran as liegen könnte.

    Übrigens: Ich würde empfehlen, Visual Studio auf Englische Sprache umzustellen. Die deutschen Fehlermeldungen werden es dir schwer machen, selbst nach Lösungen zu suchen. Die übersetzen da teilweise C++-spezifische Begriffe mit Wörtern, die kein deutschsprachiger C++-Programmierer so verwenden würde.


Log in to reply