PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] GCC produziert nur noch Mist



hirnfrei
31.05.2017, 19:27
Mahlzeit!

Ich habe ein echt seltsames Problem. Im Moment arbeite ich mich gerade in C++ und wxWidgets ein. Dazu nutze ich Geany als IDE. Vor ein paar Wochen, wo ich mein Projekt das letzte Mal bearbeitet habe, konnte ich das Programm compilieren, linken und im Anschluss auch ausführen.

Compilieren und Linken funktioniert zwar immer noch, aber wenn ich es mit Geany dann ausführen will heisst es nur


/tmp/geany_run_script_0F8N0Y.sh: Zeile 7: ./app: Keine Berechtigung


Also habe ich es mal vom Terminal aus versucht


g++ -Wall -std=c++11 -c `wx-config --cppflags` `wx-config --libs` kipperei.cpp


Läuft ohne Probleme durch, doch habe ich am Ende eine nicht ausführbare Datei. Okay, die kann man ja ausführbar machen. Doch wenn ich das gemacht habe und es dann versuche zu starten kommt folgendes


bash: ./kipperei: Kann die Binärdatei nicht ausführen: Fehler im Format der Programmdatei

Das kann ich nicht ganz nachvollziehen! Bislang funktionierte es doch einwandfrei! Habe nun auch schon ein paar GCC ausprobiert.


x86_64-pc-linux-gnu-6.3.0


sowie


x86_64-pc-linux-gnu-5.4.0


In beiden Fällen der gleiche Effekt.

Bei wxWidgets verwende ich


gtk3-unicode-3.0-gtk3


Es ist mir ein absolutes Rätsel! Hat jemand einen Rat?

shedepe
01.06.2017, 14:41
Rufst du deinen Linker getrennt auf ?
Das Argument -c bedeutet nämlich:



-c Compile and assemble, but do not link.



Zu deinem Problem mit Geany. Schau ob du im Dateisystem lese, schreib und ausführ Rechte hast. Hast du das ganze mal mit Rootrechten kompiliert? Dann wurde die Executable nämlich auch mit Root rechten angelegt und darf vom normalen Benutzer nicht überschrieben und eventuell nicht ausgeführt werden.

Im Zweifelsfall den Ordner mit den Buildartefakten mal löschen und noch mal probieren.

hirnfrei
01.06.2017, 15:06
Okay! Wie auch immer das -c da reingeraten ist, ich musste es einfach nur entfernen und schon läuft alles. Auch Geany!

Danke für deine Hilfe!

shedepe
02.06.2017, 15:12
Zu deiner Frage des linkens: Prinzipiell kannst du direkt mit gcc oder g++ linken. Das wird auch automatisch gemacht wenn du g++ aufrufst.

Das passiert wenn du g++ oder gcc aufrufst:

1. Der C++ Präprozessor "cpp" wird aufgerufen - Dieser löst defines und include statements auf. (Alle Statements die mit # anfangen). Letztendlich bedeutet ein include -> Kopier das entsprechende Headerfile an die Stelle rein
2. Der eigentliche Compiler wird aufgerufen. Dieser liest die im 1. Schritt entstandenen Files ein und generiert Objectfiles darauf (Maschinencode)
3. Der Linker wird aufgerufen und verbindet die Objectfiles miteinander -> Es kommt eine ausführbare Datei bei raus

Prinzipiell kannst du alle Schritte auch von Hand ausführen