• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

[C] GTK Bibliothek einbinden

Zwiebelmett

Neu angemeldet

Registriert
9 Jan. 2017
Beiträge
19
Hallo,

ich habe mit C folgendes Problem, ich möchte ein Projekt compilieren, das schlägt aber mit folgender Fehlermeldung fehl:

Code:
############################################# Building dbexample #############################################
Build Environment should be sane
Building main ...
ROOTBUILD gal
Building gal ...
In file included from /usr/include/gtk-2.0/gtk/gtk.h:234:0,
                 from gal.h:21,
                 from gal.c:15:
/usr/include/gtk-2.0/gtk/gtkitemfactory.h:47:1: error: function declaration isn’t a prototype [-Werror=strict-prototypes]
 typedef void (*GtkItemFactoryCallback)  ();
 ^~~~~~~
cc1: all warnings being treated as errors
make[1]: *** [Makefile:19: gal] Error 1
make: *** [Makefile:122: gal] Error 2

Meine IDE sagt mir auch, das im gal-Header, die <gtk/gtk.h> und <gdk/gdkx.h> nicht gefunden werden.
Das sagt doch auch die Fehlermeldung quasi aus?

So, jetzt die Noob-Frage, wie installiere ich GTK für ein Projekt?
Auf meinem System läuft ein Antergos Linux und ich meine ich habe Gtk installiert.

Muss man das für ein C-Projekt nochmal lokal im Projekt installieren?

Ich bitte um etwas Rücksicht, da ich noch etwas anfänglich unter C unterwegs bin. ^^

Gruß,

Mett
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
Hi,

Wenn du unter Linux bist, solltest du dir, falls noch nicht getan "pkg-config" installieren, das vereinfacht vieles...

Dann ein "pkg-config --list-all" ausführen, wenn alles richtig ist siehtst du welche Bibliotheken zum Linken zu deiner Verfügung stehen. Oder direkt "pkg-config --list-all | grep gtk" aus. Wenn er dir "gtk+-2.0" anzeigt, hast du die Dev Header installiert. Ansonsten mußt du diese logischerweise nachinstallieren. Zum Beispiel "libgtk2.0-dev" oder ähnlich, kenne mich mit "Antergos Linux" nicht aus und weiß daher nicht wie das Paket "genau" heißt.

Im Makefile kann dann so gelinkt werden, zb:
gcc gal.c `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0` -o galbin

Ich hab das bisher nur mit GTK3 gemacht, aber für GTK2 sollte die Empfehlung, "pkg-config" zu nutzen, auch gelten.

Das sollte dann auch den Fehler beheben. :)
 

Zwiebelmett

Neu angemeldet

Registriert
9 Jan. 2017
Beiträge
19
  • Thread Starter Thread Starter
  • #3
Der Befehl [src=bash]gcc gal.c `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0` -o gabinl[/src]
führt zur folgenden Ausgabe:

[src=bash]gcc: error: `pkg-config: No such file or directory
gcc: error: gtk+-2.0`: No such file or directory
gcc: error: `pkg-config: No such file or directory
gcc: error: gtk+-2.0`: No such file or directory
gcc: error: unrecognized command line option ‘--cflags’
gcc: error: unrecognized command line option ‘--libs’
[/src]

Wenn ich aber [src=bash]pkg-config --cflags gtk+-2.0
-pthread -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/pango-1.0 -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/libdrm -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libpng16 -I/usr/include/pango-1.0 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include[/src] ausführte, geht der Befehl, genauso wie bei

[src=bash]pkg-config --libs gtk+-2.0
-lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype[/src]
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
Versuch mal, testweise statt der:
`
ein
'

aber eigentlich sollte das gehen.... hängt vielleicht an der Shell/GCC Version(?), ich bin mir etwas unsicher :D

Aber die Libs sind ja eindeutig installiert. :T
 
Zuletzt bearbeitet:

Zwiebelmett

Neu angemeldet

Registriert
9 Jan. 2017
Beiträge
19
  • Thread Starter Thread Starter
  • #5
Jetzt hänge ich hier fest ...

[src=bash]gcc gal.c -I 'pkg-config --cflags gtk+-2.0' 'pkg-config --libs gtk+-2.0' -o gabinl
gcc: error: pkg-config --libs gtk+-2.0: No such file or directory[/src]

Hab schon ` ausprobiert und führt zum selben Ergebnis :/
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
Das "-I" für Include ist schon einmal falsch, damit sagst du GCC er soll das Verzeichnis inkludieren... es ist aber ein Befehl.

Ich glaube aber auch, es hängt am GCC und wie der die Zeile verarbeitet. Ist das eine ältere Version?
Also ich würde danach googlen, wie man in GCC (Version) ein Argument "Shell" Befehl einbindet.

Ne andere Idee hab ich spontan leider auch nicht, aber es ist bestimmt GCC und nicht die Shell. In meiner GCC Version kann ich mit "`" arbeiten.
 

Asseon

Draic Kin

Registriert
14 Juli 2013
Beiträge
10.353
Ort
Arcadia
Benutze besser die modernere syntax $(your_favourite_command). backticks sollten allerdings eigentlich auch gehen, single quotes dagegen machen etwas anderes.

Das hat btw rein gar nichts mit gcc zu tun, das wird von der shell interpretiert und als eigenes Kommando ausgeführt, der output wird dann an der stelle eingefügt.


Das Problem ist vermutlich einfach ein -Werror, oder ähnlich in im ursprünglichen Befehl. Das im ersten post gezeigte würde normalerweise nicht als "error" sondern als "warning" gewertet werden, was nicht zum Abbruch führen würde.
 
Zuletzt bearbeitet:

Brother John

(schein)heilig
Veteran

Registriert
1 Aug. 2013
Beiträge
235
GTK ist offensichtlich installiert, weil der Fehler ja in einem GTK-Header auftritt. Eigentlich wäre das Problem auch “nur” eine Warnung. Da aber GCC konfiguriert ist, alle Warnungen als Fehler zu interpretieren, knallt’s.

Die Zeile, die er anmeckert, ist ein stinknormaler, erzlangweiliger typedef für einen Funktionspointer; zumindest aus meiner C++-geprägten Sicht. Wenn man nach der Fehlermeldung sucht, findet man viel in die Richtung, dass ja in C
Code:
void foo();
was anderes ist als
Code:
void foo(void);

Möglicherweise ist GTK einfach nicht dafür gemacht, mit so restriktiven Compilereinstellungen verwendet zu werden …? Was mich interessieren würde: Was ist das für ein Projekt, das du bauen willst? Welches Buildsystem verwendet das (CMake, autotools (also was mit ./configure), etc.)? Kriegt man das so verbose geschaltet, um mal eine vollständige Compiler-Kommandozeile zu sehen? Probier dafür mal
Code:
make VERBOSE=1
oder
Code:
make V=1

@theSplit
Du hast doch Erfahrung mit C und GTK. Hast du schon mal versucht, etwas mit GTK-Dependency so restriktiv zu bauen?
 

theSplit

1998
Veteran Barkeeper

Registriert
3 Aug. 2014
Beiträge
28.561
@Brother John:
Wenn du mit Restriktiv meinst, das auf alle Fehler, "-Wall", gelauscht wird. Ja das funktioniert. Allerdings hab ich nur GTK3 getestet. Zu GTK2 kann ich praktisch nicht viel sagen.

Ich verstehe den Fehler aus dem ersten Post aber so, das eine Vorwärtsdeklaration fehlt, weil eine Header Datei, ohne die Lib Angabe/Includes nicht gefunden wird.
Ansonsten, ich hab selbst noch nicht mit Typedef in der Form gearbeitet. "Scheinbar" Funktionspointer... ist für mich noch Voodoo....
 
Zuletzt bearbeitet:

Brother John

(schein)heilig
Veteran

Registriert
1 Aug. 2013
Beiträge
235
Ich verstehe den Fehler aus dem ersten Post aber so, das eine Vorwärtsdeklaration fehlt
Nach nochmal genau meinen eigenen Link lesen ;) … Nein, das Problem ist, dass bei aktivem strict-prototypes Funktionsdeklarationen ohne explizite Parameterliste nicht als gültige Prototypen akzeptiert werden. Macht auch Sinn, denn z.B. void foo(); sagt dem C-Compiler: »Hey Compiler, da gibts eine Funktion namens foo, die nichts zurückgibt. Aber ätsch, welche Parameter sie hat, sag ich dir nicht.«

»Hat keine Parameter« ist natürlich eine gültige Ausprägung von »sag ich dir nicht«. Deswegen Arbeitshypothese, bis wir vom Threadstarter hören: -Werror=strict-prototypes ist zu restriktiv, um GTK-Header compilieren zu können. Mit dieser Einstellung müsste die angemeckerte Zeile
[src=c]typedef void (*GtkItemFactoryCallback)();[/src]
so umgeschrieben werden
[src=c]typedef void (*GtkItemFactoryCallback)(void);[/src]
… unter der Voraussetzung, dass tatsächlich eine Funktion ohne Parameter gemeint ist. Die Lösung ist dann, den strikten Prototypencheck abzuschalten. Die Compileroption dafür müsste -Wno-strict-prototypes sein.

"Scheinbar" Funktionspointer... ist für mich noch Voodoo....

Funktionspointer sind echt eine der hässlichsten Syntax-Ecken. Sie werden ganz gut handhabbar, wenn man einmal das System versteht und dann jede – aber wirklich jede einzelne – Funktionspointer-Deklaration typedeft. Dann sind auch geschachtelte Funktionspointer noch lesbar.

Einfaches Beispiel:
[src=c]void func(int param);[/src]
Das wichtige an der Signatur sind aus Typsystemsicht die Typen. Die Namen sind eher mittelinteressant. Also ohne Namen:
[src=c]void (int);[/src]
Jetzt brauchen wir einen Pointer auf so eine Funktion. Den fügt man zwischen Returntype und Parameterliste ein, und zwar so:
[src=c]void (*)(int);[/src]
Das ist jetzt ein Pointer auf eine Funktion, die einen int nimmt und nix zurückgibt. Dem Ding kannst du per typedef einen Namen geben. Weil die C-Syntax an der Stelle auf maximale Verwirrung ausgelegt ist, muss der Name direkt nach dem Pointer-Sternchen stehen. Also:
[src=c]typedef void (*MyFuncPtr)(int);[/src]
Verwendung dann so:
[src=c]typedef void (*MyFuncPtr)(int);

void foo(int bar)
{
// ... do something interesting ...
}

int main(int, char**)
{
// In C++ ist das address-of & optional. Weiß nicht, ob auch in C.
// Kann aber nicht schaden, es explizit hinzuschreiben.
MyFuncPtr fp = &foo;

// Beide Aufrufe sind äquivalent.
fp(42);
foo(42);

return 0;
}[/src]
Und damit ihr mich berechtigt als C++-Fanboy schlagen könnt, zum Vergleich:
[src=cpp]using MyFuncPtr = void (*)(int);
using MyFunc = void (int); // Alternativansatz, oft lesbarer

void foo(int bar)
{
// ... do something interesting ...
}

int main()
{
MyFuncPtr fp1 = &foo;
MyFunc* fp2 = &foo;

// Aufrufe sind äquivalent.
fp1(42);
fp2(42);
foo(42);
}[/src]
Die Alternative geht mit entspr. typedef-Syntax evtl. auch in C. Ich mag die recht gern, weil man dann in der Verwendung sofort explizit sieht, dass es ein Pointer ist. Bei der ersten Variante bleibt das versteckt oder man muss es in den typedef-Namen reincodieren.
 
Zuletzt bearbeitet:
Oben