Programm mit Cygwin übersetzen klappt net
-
Hallo noch mal,
ich versuche, https://github.com/px86/png-steganography-tool für Windows zu übersetzen, aber scheitere immer an folgender Fehlermeldung:
$ 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/ src/pngs.cpp:4:10: fatal error: bits/stdint-uintn.h: No such file or directory 4 | #include <bits/stdint-uintn.h> | ^~~~~~~~~~~~~~~~~~~~~ compilation terminated.
Hätte vielleicht jemand eine Idee?
-
Wenn es nur um die Typen
uintX_t
geht, dann reicht einfach<cstdint>
: Fixed width integer types (since C++11).Der Header <bits/stdint-uintn.h> ist wohl speziell ein Linux gcc Header (eigentlich für C - sieht man auch an der Endung
.h
).
-
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?
-
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.
-
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
undhtonl
zu sein, für welchearpa/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 eigenentohl
/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
-
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
-
Das Kompilieren hat damit geklappt.
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"?
-
-
@Th69 sagte in Programm mit Cygwin übersetzen klappt net:
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.
-
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
)
-
Uppps, hab noch etwas übersehen... Leider sind in der Ausgabe noch die Unix-Steuerzeichen drin, die Windows nicht interpretieren kann:
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:
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.