Programm mit Cygwin übersetzen klappt net


  • Gesperrt

    Das ist ja übel:

    #include "pngs.hpp"
    #include "crc.hpp"
    
    #include <cstdint>
    #include <cstddef>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <fstream>
    #include <arpa/inet.h>
    #include <iomanip>
    

    das hat er gerade kompiliert:

    $ x86_64-pc-cygwin-g++.exe -Wall -Werror -std=c++17 src/main.cpp src/pngs.cpp src/crc.cpp -o pngs.exe -I src/include/

    Die nächsten Probleme sind aber beim Ausführen der exe:

    • cygwin1.dll nicht gefunden
    • cyggcc_s-seh-1.dll nicht gefunden
    • cygstdc++-6.dll nicht gefunden

    @Th69 Siehst du noch eine Chance darin, diese Library unter Windows zum Laufen zu bekommen?
    🙂


  • Gesperrt

    Wenn ich mit x86_64-w64-mingw32-g++.exe übersetze...

    $ x86_64-w64-mingw32-g++.exe -Wall -Werror -std=c++17 src/main.cpp src/pngs.cpp src/crc.cpp -o pngs.exe -I src/include/
    src/pngs.cpp:10:10: fatal error: arpa/inet.h: No such file or directory
       10 | #include <arpa/inet.h>
          |          ^~~~~~~~~~~~~
    compilation terminated.
    
    


  • Die Cygwin-DLLs sollten ja bei dir in dem Installationsverzeichnis vorhanden sein - du mußt nur schauen, ob der Pfad dazu in der Umgebungsvariablen PATH eingetragen ist.


  • Gesperrt

    Ja, aus der Cygwin-Shell heraus klappt das auch ganz gut, aber ich wollte eigentlich ein Binary erstellen, um dieses weitergeben zu können...



  • @EinNutzer0 sagte in Programm mit Cygwin übersetzen klappt net:

    src/pngs.cpp:10:10: fatal error: arpa/inet.h: No such file or directory
       10 | #include <arpa/inet.h>
          |          ^~~~~~~~~~~~~
    compilation terminated.
    

    Wenn ich das beim groben Überfliegen richtig sehe, scheinen es vor allem die Funtionen ntohl und htonl zu sein, für welche arpa/inet.h benötigt wird. Mit diesen Funktionen werden Integer zwischen Maschinen- und Netzwerk-Bytereihenfolge (Big-Endian) konvertiert. Ich vermute mal, dass PNG innerhalb der Datei immer letztere verwendet, daher diese Funktionen, um die Integer aus der Datei korrekt auszulesen.

    Auf Big-Endian-Sytemen (z.B. für Big-Endian konfigurierte ARM, MIPS, PowerPC) dürften die Funktionen No-Ops sein, während für x86/x64 (Little-Endian) die Bytereihenfolge umgekehrt werden muss. Diese Funktionen sind trivial selbst zu implementieren (u.a. in diesem Thread angerissen), ansonsten dürften sich Implementierungen davon zuhauf irgendwo im Netz finden lassen.

    Wenn ich nichts weiteres übersehen habe sind das und die Deklarationen in stdint-uintn.h die einzigen linux-spezifischen Sachen die verwendet werden. Ziemlich unnötig unportabel, wenn du mich fragst (kommt bei linux-zentrischer Software meiner Erfahrung öfter mal vor, dass die Portierung an solchen Banalitäten scheitert).

    Ich vermute mal, wenn du cstdint verwendest und eigene ntohl/htonl-Implementierungen zur Verfügung stellst, dass du auf Cygwin komplett verzichten und das Program direkt mit MingW bauen kannst (nur die .exe notwendig, sofern statisch kompiliert). Ansonsten wie @Th69 erwähnt hat, einfach die benötigten Cygwin-DLLs mit ausliefern und direkt neben die .exe packen. Dann sollten sie auch gefunden werden.

    Edit: Unter Windows werden diese Funktionen übrigens auch zur Verfügung gestellt, und zwar in der winsock.h.

    Einfach:

    #if defined(_WIN32)
        #include <winsock.h>
    #else
        #include <arpa/inet.h>
    #endif
    

    sollte also theoretisch bereits reichen. Probier's einfach mal aus, wenn nochwas anderes fehlt, wird der Compiler sicher meckern 😉


  • Gesperrt

    Hm, geht leider noch nicht:

    #include "pngs.hpp"
    #include "crc.hpp"
    
    #include <cstdint>
    #include <cstddef>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <fstream>
    #if defined(_WIN32)
        #include <winsock.h>
    #elif defined(_WIN64)
        #include <winsock2.h>
    #else
        #include <arpa/inet.h>
    #endif
    #include <iomanip>
    
    $ x86_64-w64-mingw32-g++.exe -Wall -Werror -std=c++17 src/main.cpp src/pngs.cpp src/crc.cpp -o pngs.exe -I src/include/
    /usr/lib/gcc/x86_64-w64-mingw32/11/../../../../x86_64-w64-mingw32/bin/ld: /tmp/ccss80w9.o:pngs.cpp:(.text+0x110): undefined reference to `__imp_ntohl'
    /usr/lib/gcc/x86_64-w64-mingw32/11/../../../../x86_64-w64-mingw32/bin/ld: /tmp/ccss80w9.o:pngs.cpp:(.text+0x250): undefined reference to `__imp_htonl'
    /usr/lib/gcc/x86_64-w64-mingw32/11/../../../../x86_64-w64-mingw32/bin/ld: /tmp/ccss80w9.o:pngs.cpp:(.text+0x814): undefined reference to `__imp_htonl'
    collect2: error: ld returned 1 exit status
    
    

    Ich weiß nicht, gegen was ich da linken sollte...



  • @EinNutzer0 steht in der MS-Doku, https://learn.microsoft.com/en-us/windows/win32/api/winsock/nf-winsock-ntohl:

    Library Ws2_32.lib

    ->

    x86_64-w64-mingw32-g++.exe ... -lws2_32

    Der Name ist echt nicht leicht zu raten, das muss man schon nachlesen 😉


  • Gesperrt

    Das Kompilieren hat damit geklappt. 👍🏻 😊

    https://ibb.co/Lp3ZdT3

    Leider noch zwei Fehler:

    • libgcc_s_seh-1.dll fehlt
    • libstdc++-6.dll fehlt

    Gibt es eine Möglichkeit, diese DLLs "statisch zu linken/binden"?




  • Gesperrt

    @Th69 sagte in Programm mit Cygwin übersetzen klappt net:

    s. How to statically link missing libgcc_s_seh-1.dll and libstdc++-6.dll DLLs for 9.3-win32 MinGW executable

    Wunderbar, das hat funktioniert...

    Aber gleich der nächste Fehler: https://ibb.co/LRVdnRt

    Aber mal Hand aufs Herz, woher soll man das wissen, wenn das nirgendwo steht?!



  • Du weißt schon, daß es Suchmaschinen für's Internet gibt???

    Probiere mal zusätzlich noch -static -lpthread, s.a. C++ – MinGW.exe requires a few gcc dll’s regardless of the code.


  • Gesperrt

    Hat geklappt:

    $ x86_64-w64-mingw32-g++.exe -static-libgcc -static-libstdc++ -static -lpthread -Wall -Werror -std=c++17 src/main.cpp src/pngs.cpp src/crc.cpp -o pngs.exe -I src/include/ -lws2_32

    pngs.exe ist nun ausführbar.

    Ich hab euch mal eine kleine Grafik erstellt: https://s20.directupload.net/images/220925/3mv2mmk8.png

    Ihr wisst, was zu tun ist. 😃

    (pngs.exe -x scrt 3mv2mmk8.png mt.txt)


  • Gesperrt

    Uppps, hab noch etwas übersehen... Leider sind in der Ausgabe noch die Unix-Steuerzeichen drin, die Windows nicht interpretieren kann:

    https://ibb.co/ssWD5zH

    Gibt es dafür einen einfachen "Workaround"?



  • @EinNutzer0 sagte in Programm mit Cygwin übersetzen klappt net:

    Uppps, hab noch etwas übersehen... Leider sind in der Ausgabe noch die Unix-Steuerzeichen drin, die Windows nicht interpretieren kann:

    https://ibb.co/ssWD5zH

    Gibt es dafür einen einfachen "Workaround"?

    Ja. Z.B. in MinTTY ausführen oder einem anderen Terminal, welche ANSI-Escape-Sequenzen interpretieren kann. Ich habs noch nicht ausprobiert, aber Windows Terminal sollte damit klarkommen können. Ich glaube auch die Konsole, die PowerShell öffnet, kommt mit den Sequenzen klar (nicht ganz sicher). Zumindest aber eine WSL-Shell-Konsole (die kann auch Windows-Executables ausführen).

    Alternativ die Steuerzeichen aus dem Code herausnehmen oder nach Windows portieren.


Anmelden zum Antworten