Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

YAR

Frischling

  • »YAR« ist der Autor dieses Themas
  • Private Nachricht senden

1

17.01.2017, 20:05

[GELÖST]Fehlerhaftes Programm nach Kompilierung

Hallo Forum

ich bin bei einem meiner Experimente auf ein Problem gestoßen, bei dem ich nicht einmal genau sagen kann, ob das Problem der Compiler oder mein Code ist. Es geht darum:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <vector>
#include <string>

using namespace std;

class weapon
{
public:
    int m_item_type;
    string m_weapon_name;
    int m_item_id;
    int m_weapon_damage;
    
    weapon (int type = 0, string name = "", int id = 0, int damage = 0) :
        m_item_type{type}, m_weapon_name{name}, m_item_id{id}, m_weapon_damage{damage}
        {
            cout << "Standardkonstruktor von \"weapon\" aufgerufen." << endl;
        }
        
    weapon (const weapon& wp) :
        m_item_type(wp.m_item_type), m_weapon_name(wp.m_weapon_name), m_item_id(wp.m_item_id), m_weapon_damage(wp.m_weapon_damage)
    {
        cout << "Kopierkonstruktor von \"weapon\" aufgerufen." << endl;
    }
};

int main()
{
    vector<weapon> weapons;
    
    weapons.push_back (weapon(2, "Test", 12, 125));
    
    return 0;
}


Das Ganze ist im Grunde nur ein Experiment, in dem ich schauen will, wann der Kopierkonstruktor und wann ein Konstruktor aufgerufen wird. Dazu spiele ich ein wenig mit Containern.
Der Compiler gibt keine Fehlermeldungen oder Warnungen aus, sondern kompiliert anstandslos. Das daraus resultierende Programm ist allerdings 18 MB groß und nicht ausführbar.
Wenn ich der Datei manuell Ausführrechte verleihe, bekomme ich bei der Ausführung eine Fehlermeldung:

Quellcode

1
2
3
4
5
6
$ g++ -Wall -Wextra -pedantic -std=c++14 ./cpp-Tests/vektor_eigene_klasse.hpp -o /home/christian/Programme/c++/vektor_eigene_klasse
$ ls -lh ./Programme/c++/vektor_eigene_klasse
-rw-r--r-- 1 christian christian 18M 17. Jan 19:50 ./Programme/c++/vektor_eigene_klasse
$ chmod 777 ./Programme/c++/vektor_eigene_klasse
$ ./Programme/c++/vektor_eigene_klasse
bash: ./Programme/c++/vektor_eigene_klasse: Kann die Binärdatei nicht ausführen: Fehler im Format der Programmdatei


Andere Programme kompilieren ohne Probleme und lassen sich auch ausführen, also stimmt etwas mit dem Code nicht, oder ich habe einen sehr speziellen Bug gefunden.
Fällt irgendjemandem irgendetwas auf, das ich irgendwie ändern müsste?

Zu meinem Setup:
OS: Arch Linux (auf dem aktuellen Stand)
Compiler: GCC (G++)
Das muss so!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »YAR« (17.01.2017, 23:07)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

17.01.2017, 20:23

Ist zwar an sich kein Fehler, aber du nennst dein Source-File wirklich "hpp"?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

17.01.2017, 20:45

Versuch doch mal Schritt für Schritt das Programm zu reduzieren, bis es wieder korrekt kompiliert - also auf das Notwendigste beschränken!

YAR

Frischling

  • »YAR« ist der Autor dieses Themas
  • Private Nachricht senden

4

17.01.2017, 21:18

Ist zwar an sich kein Fehler, aber du nennst dein Source-File wirklich "hpp"?


.cpp wär passender, nicht?
Dass ich die Dateien als Header führe ist eine schlechte Angewohnheit. Wann immer ich experimentiere und einfach alles der Einfachheit halber in eine Datei quetsche, gebe ich ihr die Endung .hpp. Wie ich dazu gekommen bin, weiß ich aber selbst nicht ?(
Wenn ich mit mehreren Dateien arbeite oder ein Programm schreibe, mit der Absicht es zu behalten, achte ich aber schon auf die Endungen ;)

So wie es aussieht, hat mein Arch Linux ein fundamentaleres Problem. Beispielsweise kann ich den Zwischenspeicher (kopieren, einfügen) nicht mehr nutzen und die KDE-Einstellungen sind sehr vergesslich geworden.
Da ich erst vor ein paar Stunden ein großes Update hatte und Arch mit seiner "Bleeding-Edge-Politik" für Verschlimmbesserungen bekannt ist, werde ich jetzt erstmal das Update rückgängig machen. Wenn ihr nichts mehr von mir hört,
ist die Kante verblutet ;)
Das muss so!

YAR

Frischling

  • »YAR« ist der Autor dieses Themas
  • Private Nachricht senden

5

17.01.2017, 23:04

Ist zwar an sich kein Fehler, aber du nennst dein Source-File wirklich "hpp"?


DAS war der Fehler. Offenbar behandelt gcc Headers anders als Source-Dateien. Bei genauer Betrachtung war die Datei, in der sich main() befindet, sogar bei mir immer eine .cpp.
Offenbar sollte ich in Zukunft eher auf meine Gewohnheiten als auf meinen Code achten. Damit sie nicht noch schlimmer werden.

Ich danke euch für die Hilfe und entschuldige mich für den falschen Alarm :rolleyes:
Das muss so!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

17.01.2017, 23:40

Ist aber trotzdem komisch, wenn der GCC eine korrupte "ausführbare" Datei erzeugt. Was steht denn da drin?

YAR

Frischling

  • »YAR« ist der Autor dieses Themas
  • Private Nachricht senden

7

18.01.2017, 10:26

Was steht denn da drin?


Was meinst du damit?
Das muss so!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

18.01.2017, 15:35

Sieht der Inhalt aus wie eine ausführbare Datei? Sind die 2., 3. und 4. Zeichen "ELF"?

YAR

Frischling

  • »YAR« ist der Autor dieses Themas
  • Private Nachricht senden

9

18.01.2017, 18:03

Ich hoffe, ich habe dich da richtig verstanden und hab das "Programm" einfach mal mit einem Texteditor geöffnet.
Die Datei enthält tatsächlich überraschend viel lesbaren Text, der mich ein wenig an Header aus der C++ Standardbibliothek erinnert - zumindest an die paar Zeilen, die ich mir so aus Neugierde angesehen und nicht verstanden habe.

Ich hätte gerne einen kurzen Ausschnitt als Code hier eingefügt, aber irgendetwas spielt da nicht mit (keine Ahnung, was es diesmal ist...). Deshalb habe ich wenigstens einen Screenshot angehängt.
»YAR« hat folgendes Bild angehängt:
  • Screenshot.png
Das muss so!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

18.01.2017, 18:15

Ah, das "gpch" am Anfang bedeutet wohl, dass es sich um einen vorkompilierten Header handelt. Damit beschleunigt man die Kompilierung, wenn man viele Dateien einbindet. Wenn du dem GCC einen Header als Eingabe gibst, macht er daraus einen vorkompilierten Header, keine ausführbare Datei.

Werbeanzeige