Konstruktor: interner Compiler-Fehler wegen Klassennamen

#1

Moin,

ich sitz jetzt schon ein paar Stunden an den Problem, und auch Google/Bücher geben keine Antwort mehr her. Ich habe ein Problem mit einem Konstruktor, was mir so noch nie passiert ist.

Folgendes:

Header:

#define XSERVER_H
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <string.h>


class Xserver {
 public:
    void start();
    void createWindow();

 private:
    Display *display;
    Visual *visual;
    int depth;
    int text_x;
    int text_y;
    XSetWindowAttributes frame_attributes;
    Window frame_window;
    XFontStruct *fontinfo;
    XGCValues gr_values;
    GC graphical_context;
    XKeyEvent event;
    int string_length = strlen(Hstring);
    char Hstring[] = "TestDesXservers";  
   
      
};
#endif

source:

#include <stdio.h>
#include <X11/Xlib.h>
#include <string.h>
#include "../inc/Xserver.h"

void Xserver::start()
{
    Xserver::display = XOpenDisplay(NULL);
    Xserver::visual = DefaultVisual(display, 0);
    Xserver::depth = DefaultDepth(display, 0);
}

void Xserver::createWindow()
{
    Xserver::frame_attributes.background_pixel = XWhitePixel(display, 0);
    Xserver::frame_window = XCreateWindow(display, XRootWindow(display, 0),
				 0, 0, 400, 400, 5, depth,
				 InputOutput, visual, CWBackPixel,
				 &frame_attributes);
    XStoreName(display, frame_window, "atlas");
    XSelectInput(display, frame_window, ExposureMask | StructureNotifyMask);
    Xserver::fontinfo = XLoadQueryFont(display, "10x30");
    Xserver::gr_values.font = fontinfo->fid;
    Xserver::gr_values.foreground = XBlackPixel(display, 0);
    Xserver::graphical_context = XCreateGC(display, frame_window,
				  GCFont+GCForeground, &gr_values);
    XMapWindow(display, frame_window);

    while(1)
    {
	XNextEvent(display, (XEvent *)&event);
	switch(event.type)
	{
	case Expose:
	    {
		XWindowAttributes window_attributes;
		int font_direction, font_ascent, font_descent;
		XCharStruct text_structure;
		XTextExtents(fontinfo, Xserver::Hstring, Xserver::string_length,
			     &font_direction, &font_ascent, &font_descent,
			     &text_structure);
		XGetWindowAttributes(display, frame_window, &window_attributes);
		Xserver::text_x = (window_attributes.width - text_structure.width)/2;
		Xserver::text_y = (window_attributes.height - (text_structure.ascent - text_structure.descent))/2;
		XDrawString(display, frame_window, graphical_context,
			    Xserver::text_x, Xserver::text_y, Xserver::Hstring, Xserver::string_length);
		break;
	    }
	default:
	    break;
	}
    }
}

main:

#include <stdlib.h>
#include <stdio.h>
#include "inc/Xserver.h"

/*starting main*/
int main(int argc, char *argv[])
{
    Xserver* X11 = new Xserver();
    X11->start();
    X11->createWindow();
    return 0;
}

compilen tu ich alles mit CMake

CMakeLists.txt:

#atlas project
cmake_minimum_required(VERSION 3.5.2)
project(atlas)

set(SRC main.cpp src/Xserver.cpp inc/Xserver.h)
add_executable(atlas ${SRC})
target_link_libraries(${PROJECT_NAME} X11)

So viel zum Code.

Der Fehler ist folgender:


atlas/inc/Xserver.h:9:7: interner Compiler-Fehler: in finish_expr_stmt, bei cp/semantics.c:677
 class Xserver {

Ich möchte den Standart-ctor nutzen.

Wo ist mein Fehler? Für Hilfe wär ich Dankbar, ich bin leicht am Verzweifeln.

Danke, xygnu

#2

ohne C+±Kenntnisse:
klingt nicht gut, die Fehlermeldung kommt in deutsch direkt im Internet gar nicht erst vor,
in englisch “compiler error: in finish_expr_stmt” auch nur einmal in einem Bug

deine Vorgehensweise erscheint mir merkwürdig:
welchen Einfluss vermutest du in der Methode createWindow() als Header + Implementierung mit frame_attributes.background_pixel und wer weiß nicht alles?

in solchen Fällen mit doch anscheinend grundlegenden Fehlern an der Klassendefinition besser sofort vereinfachen:
ist eine leere Klasse

class Xserver {
      
};

oder was immer sonst die einfachste mögliche Variante ist, kompilierbar?

wenn auch nicht kompilierbar, dann zumindest umso übersichtlicher und klarer wie grundlegend der Fehler ist,
wenn es aber so zu kompilieren geht, dann Schritt für Schritt Methoden und Variablen (Java-Sprech :wink: ) usw. reinnehmen, bis der Fehler auftritt


aus dem was aus leicht ähnlichen Fehler-Topics eben gelesen
und sich aus allgemeiner Welterfahrung für diese Art Fehler eh anbietet noch genannt:

Diese Problem [ein anderes als hier] habe ich leider auch von Zeit zu Zeit. Bisher konnte ich mir immer wie folgt helfen:
Unter Projektoptions/Verzeichnisse lösche ich einige Include Verzeichnisse,
die nicht mehr benötigt werden bzw. lösche und füge ich die gelöschten bei Bedarf wieder ein.
Bisher hat es immer geholfen. Don’t ask me why !

da ist letztlich immer was wahres dran, was zu löschen/ zu deinstallieren und neu aufzusetzen geht im Zweifel immer versuchen,
bis hin zum Betriebssystem und neuen Rechner und Stromanbieter wechseln :wink:

#3

mogel@lucretia:~/temp/xygnu$ cmake CMakeLists.txt                                                                                                                                                                                            
CMake Error at CMakeLists.txt:2 (cmake_minimum_required):                                                                                                                                                                                    
  CMake 3.5.2 or higher is required.  You are running version 3.2.2                                                                                                                                                                          

nachdem ich die Prüfung raus genommen habe, funktionierte es bei mir


mogel@lucretia:~/temp/xygnu$ cmake CMakeLists.txt 
-- The C compiler identification is GNU 5.2.1                                                                                                                                                                                                
-- The CXX compiler identification is GNU 5.2.1                                                                                                                                                                                              
-- Check for working C compiler: /usr/bin/cc                                                                                                                                                                                                  
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mogel/temp/xygnu
mogel@lucretia:~/temp/xygnu$ 

scheint also an Deiner Installation zu liegen

#4

Zumindest wäre relevant, welcher Compiler das ist. (Und warum der eine Fehlermeldung auf deutsch ausgibt!?)

#5

[QUOTE=mogel]
nachdem ich die Prüfung raus genommen habe, funktionierte es bei mir
scheint also an Deiner Installation zu liegen[/QUOTE]

Okay, ich danke für die Bestätigung, dann werd ich mich mal umsehen nach Bugfixes. CMake 3.5.2 oder GCC scheint unter Arch dann wohl noch einen Bug zu haben.

Ich schau mal wie es mit Clang/einer älteren CMake version läuft.

Grüße

Edit: @Marco13

Ich sehe gerade, Arch hat GCC 6 aus dem Testing Repo gelassen. GCC kam letzt erst raus und ich bin mir recht sicher dass es noch bugs hat.

GCC 6.1.1 & CMake 3.5.2