Linux + GTK + C läuft nur in Verbindung mit Konsole :-(
-
hallo, habe das ganze mal schnell compiliert, ergebnis wie vorher.
wenn ich das programm ohne konsole ausführe beendet es sich. mit funkioniert es. vielleicht liegt es an meinem System?Meins>
Software:
SuSE Linux 10.2 (SMP)
KDE 3.5 / Konqueror 3.5
alle Programmbibliotheken installiert, u.a. gtk 2, gcc
das ganze wird mit kdevelop(gcc) compliert.gcc -v: gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)
gtk-config --version: 1.2.10Hardware:
IBM Netfinity 5500 M20
4x P3 XEON a 500 Mhz (1 MB Cache)
1152 MB REG/ECC SD-RAM
ServeRaid SCSI
Matrox 8 MB PCI
SB Audigy Player
(kein witz, das ding steht mit verlängerungskabeln in anderem zimmer...)wäre nett wenn du mir ein paar deiner daten nennen könntest, auch mit welchen optionen du compiliert hast.
Danke!
-
cens schrieb:
hallo, habe das ganze mal schnell compiliert, ergebnis wie vorher.
wenn ich das programm ohne konsole ausführe beendet es sich.Versteh' ich nicht. Wenn ich das Teil starte und in die Textfelder zwei vernünftige Eingabewerte eintrage (z.B. /home/gpc/tmp/foo.txt und /home/gpc/tmp/bar.txt ), dann auf Einlesen klicke tut der das auch. Da beendet sich nix. Beschreib mal, was du da genau tust.
wäre nett wenn du mir ein paar deiner daten nennen könntest, auch mit welchen optionen du compiliert hast.
System:
[gpc@desktop ~]$ uname -a; gtk-config --version FreeBSD desktop 6.2-RELEASE FreeBSD 6.2-RELEASE #0: Fri Jan 12 11:05:30 UTC 2007 root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/SMP i386 1.2.10
Meine gtk+ und Konsorten Versionen:
gtk-2.10.9 glib-2.12.9 atk-1.12.4 pango-1.14.10 cairo-1.2.6_1
Kompiliert mit:
gcc -o main main.c $(pkg-config gtk+-2.0 --cflags --libs)
MfG
GPC
-
Versteh' ich nicht. Wenn ich das Teil starte und in die Textfelder zwei vernünftige Eingabewerte eintrage (z.B. /home/gpc/tmp/foo.txt und /home/gpc/tmp/bar.txt ), dann auf Einlesen klicke tut der das auch. Da beendet sich nix. Beschreib mal, was du da genau tust.
- also ich starte das prog (entweder über ./testprog in der Konsole oder im konqueror durch klick auf die Programmdatei)
- programm startet
- ich gebe den dateiname an (in dem fall relativ,& absolut im nächsten test)
- dann das ziel im nächsten feld (in dem fall relativ,& absolut im nächsten test)
- klicke auf 'einlesen' dann:
if('mit Konsole') < Datei wird kopiert, Programm beendet sich nicht>
else if('Konqueror klick') <Fenster schließt sich, es wird nichts kopiert, Befehl: killall testprog > sagt: kein Prozess gefunden, also Programm beendet.>Danke! :p
-
Hab jetzt nochmal genau mit deinen gcc optionen (gcc -o main main.c $(pkg-config gtk+-2.0 --cflags --libs)) kompiliert, leider das gleiche ergebnis.
-
cens schrieb:
if('mit Konsole') < Datei wird kopiert, Programm beendet sich nicht>
else if('Konqueror klick') <Fenster schließt sich, es wird nichts kopiert,Äh, welches if entscheidet über Konsole oder nicht Konsole? Wir sprechen noch über den Quelltext, den ich postete?
-
Hallo,
vielleicht nicht ganz verständlich, wenn ich das programm von dir mit der Konsole ausführe, funktioniert es wie beschrieben.
Wenn das programm im konqueror ausgeführt wird beendet es sich nach dem klicken auf einlesen (selbstverständlich mit richtigen pfaden).Danke!
-
Tut mir leid, ich kann das Verhalten hier nich reproduzieren. Welche Versionen von gtk+ hast du installiert?
-
Also ich habe:
gtk+ : 2.10.6-13 / von Mo 27 Nov 2006 22:02:08 CET
gtk2-engines: 2.8.1-16 / von Mo 27 Nov 2006 22:32:39 CETDanke!
-
Tjo. Alles was ich sagen kann ist: Bring dein gtk+ und Konsorten auf den aktuellsten Stand. Sorry, aber da hier das Problem nicht auftritt, kann ich nicht mehr dazu sagen. Ich müsste es an deiner Mühle sehen, aber das wird schwierig
-
Hallo, werd das ganze jetzt mal updaten und mich dann melden. Hatte mir mal die aktuelle debian version 3.1r5 für sparc runtergeladen und gewundert wieso die installation nicht klappt, habe mir die finger wund installiert, bis ich mal widerwillen in der Bugliste nachgelesen habe - und tatsächlich seit 3.1r1a haben die debianleute die sparc installerkomponenten einfach vergessen
bisschen vom Thema abgewichen...
habe noch fragen 3, die schon seit bestimmt ein 1 Jahr beschäftigen && quälen :
1
. Gibt es bei Gtk+ eine Window-Updatefunktion, mit der man wie bei ncurses (wrefresh()) den Fensterinhalt aktualisieren kann. bisher hatte ich immer das problem das ich auf das fenster warten musste bis der leseprozess fertig war, und bei 80 GB Festplatten kann das eine weile...in zukunft soll man nämlich den leseprozess auch abbrechen können.
2
. (habe schon gesucht wie bekloppter!) gibt es in C (bestimmt nicht) oder bei Linux systemfunktionen mit denen man im handumdrehen die größe von festplatten (oder anderen Blockgeräten) ausgeben kann?, df kann das doch auch. klar man könnte ja auch mit getc zeichenweise hochzählen aber das dauert leider.
3
. ein riesiges andere problem welches ich habe ist die zeigerpositionierung mit lseek (oder so). Angeblich soll das ja in C funktionieren. es funktioniert leider bei mir nicht, in einem Kernel-Programmiererbuch (version 1.2
) von mir steht das diese funktion bei linux mit blockgeräten leider nicht funktioniert. nur leider liest mein programm fast auschließlich von blockgeräten wie z.B. /dev/sda usw.
Die netten VFS-treiber machen das ja auch irgenwie?Danke für die ganze Mühe!
-
cens schrieb:
1
. Gibt es bei Gtk+ eine Window-Updatefunktion, mit der man wie bei ncurses (wrefresh()) den Fensterinhalt aktualisieren kann. bisher hatte ich immer das problem das ich auf das fenster warten musste bis der leseprozess fertig war, und bei 80 GB Festplatten kann das eine weile...in zukunft soll man nämlich den leseprozess auch abbrechen können.
Das refreshen kannst du dir sparen. Implementiere deine Aktion einfach als Thread (Glib::Thread bietet sich an) und lass sie laufen. Über einen Signal-Handler kannst du dann z.B. den Fortschritt an das GtkWindow senden.
2
. (habe schon gesucht wie bekloppter!) gibt es in C (bestimmt nicht) oder bei Linux systemfunktionen mit denen man im handumdrehen die größe von festplatten (oder anderen Blockgeräten) ausgeben kann?, df kann das doch auch. klar man könnte ja auch mit getc zeichenweise hochzählen aber das dauert leider.
http://www.linuxforums.org/forum/linux-kernel/69520-how-get-hard-disk-info-using-c-program.html
3
. ein riesiges andere problem welches ich habe ist die zeigerpositionierung mit lseek (oder so). Angeblich soll das ja in C funktionieren. es funktioniert leider bei mir nicht, in einem Kernel-Programmiererbuch (version 1.2
) von mir steht das diese funktion bei linux mit blockgeräten leider nicht funktioniert. nur leider liest mein programm fast auschließlich von blockgeräten wie z.B. /dev/sda usw.
Die netten VFS-treiber machen das ja auch irgenwie?Das frägst du am Besten im Unix/Linux Subboard weiter unten nochmal, da bin ich überfragt... hab ja auch kein GNU/Linux.
MfG
GPC
-
danke, danke, danke!
-
Hallo, ich habe mal noch eine Frage wollte das ganze mal SuSE 9.2 testen, jedoch ohne erfolg, obwohl ich statisch kompiliert habe:
Optionen:
-O2 -g0 -s `pkg-config --cflags gtk+-2.0` \ `pkg-config --libs gtk+-2.0`trotzdem -s wird nicht statisch kompiliert.
die Fehlermeldung:
./testfunktionen: error while loading shared libraries: libpangocairo-1.0.sowie kann man dem pkg-config denn sagen das alles statisch reingepackt werden soll. sehr wichtig ist mir das das ganze möglichst kompatibel zu allen Linux-X'en ist.
Vielen Dank schon mal!
-
cens schrieb:
trotzdem -s wird nicht statisch kompiliert.
Das ist auch okay so.
-s macht das gleiche, wie wenn du nach dem Kompilieren und Linken noch strip auf das Binary anwenden würdest
Es entfernt die Symbole.
-s: Remove all symbol table and relocation information from the executable.
Was du suchst, ist -static:
-static: On systems that support dynamic linking, this prevents linking with the shared libraries. On other systems, this option has no effect.
Allerdings muss dafür auch gtk+ usw. statisch gebaut worden sein. Wenn du es dynamisch gebaut hast, kannst du lange -static angeben. Das wird nix.
Es ist normal, dass man solche Libs dynamisch linkt. Mach dir da keinen Kopf. Die binary würde eh richtig richtig fett werden, wenn du alles statisch reinkompilieren würdest.
MfG
GPC
-
Vielen Dank!,
dachte immer das -s == --static ist.
ich weiss ja nicht wie groß die datei dann werden würde, 5 MB wäre so die grenze (statt ~15 KB!). Wichtig ist mir die kompatibilität unter den Linux-Systemen, da ich das programm auf 5 verschiedenen system (versionen) verwende.
werde mal versuchen statisch zu gcc'en
-
GPwC schrieb:
Das refreshen kannst du dir sparen. Implementiere deine Aktion einfach als Thread (Glib::Thread bietet sich an) und lass sie laufen. Über einen Signal-Handler kannst du dann z.B. den Fortschritt an das GtkWindow senden.
Bin gerade am kompilieren, hast du mal praktisch einen funktionsaufruf, damit der thread im hintergrund läuft?
MfG & Danke!
Edit:
ich habe jetzt mal selber eine weile gesucht, finde bis auf den Cpp funktionsaufruf kein C aufruf. scheint sowasGlib::thread_init(); in der richtung zu sein jedoch leider nicht der richtige (habe schon ein bisschen herumprobiert jedoch ohne erfolg).
-
-
hallo, das mit dem selbstcompilieren hat nicht so ganz geklappt, jedenfalls nicht die installation, danach musste ich neu installieren...ich habe mal in der paketverwaltung nachgesehen glib gibt es auch statisch würde das ausreichen?
Noch eine Frage wie müsste ich denn statisch kompilieren also welche optionen, die mit pkg config usw.
-O2 -g0 -static `pkg-config --cflags gtk+-2.0` \
`pkg-config --libs gtk+-2.0`ist bestimmt falsch oder?
MfG & Danke!
-
cens schrieb:
hallo, das mit dem selbstcompilieren hat nicht so ganz geklappt, jedenfalls nicht die installation, danach musste ich neu installieren...ich habe mal in der paketverwaltung nachgesehen glib gibt es auch statisch würde das ausreichen?
Wenn es dir reicht, das die glib statisch dazugelinkt wird, schon. Ansonsten: nein.
Ich kann dir aber nicht sagen, ob und wie man gtk+ statisch linkt, weil ich das (a) noch nie gemacht habe und (b) die Idee auch ziemlich schwachsinnig finde. Wenn man gtk+ statisch bauen kann, muss man ihm das irgendwo mitgeben, schätzungsweise bei den Parametern der Autotools. Näheres kann ich dir auch nicht sagen.Daher mein Vorschlag: VERGISS es, gtk+ und Konsorten statisch linken zu wollen, das ist eh überall installiert und wg. Kompatibilität muss man sich wenig Sorgen machen.
Noch eine Frage wie müsste ich denn statisch kompilieren also welche optionen, die mit pkg config usw.
-O2 -g0 -static `pkg-config --cflags gtk+-2.0` \
`pkg-config --libs gtk+-2.0`ist bestimmt falsch oder?
Doch, stimmt.
MfG
GPC
-
Daher mein Vorschlag: VERGISS es, gtk+ und Konsorten statisch linken zu wollen, das ist eh überall installiert und wg. Kompatibilität muss man sich wenig Sorgen machen.
Vielen Dank,
Das kommt mir natürlich recht. Wegen der Kompatibilität: ich habe es auf SL 10.2 erstellt und auf 9.2 läuft es nicht (irgendeine pango/cairo fehlt).
In wie weit ist denn gtk+ Abwärtskompaitbel?
Danke!