PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++|Linux] Ressourcen auch unter Linux mitkompilierbar?


squall23
2008-03-29, 00:57:47
Unter Windows (VS) ist es ja möglich Bilder und ähnliche Dateien direkt in eine exe Datei hinein zu kompilieren/linken. Besteht eine ähnliche Möglichkeit auch in der Linuxwelt oder muss man dort die Dateien auslagern?

Ich hoffe ich bin in diesem Forum richtig, ist ja doch eher Programmiertechnisch interessant.

mfg squall

Gast
2008-03-29, 02:04:53
Das kommt ganz drauf an welches Framework du verwendest.

squall23
2008-03-29, 17:01:02
Auch auf die Gefahr hin, dass es ne blöde Frage ist, aber was meinst du mit welchem Framework?
Kannst du mir da ein Beispiel nennen?

mfg squall

Marscel
2008-03-29, 17:36:17
Soweit ich weiß, lässt sich bei wxWidgets ganz ähnliches bewerkstelligen, auch unter Linux.

squall23
2008-03-30, 05:09:18
Inwiefern hat das mit dem Toolkit zu tun? Ist es nicht Aufgabe des/eines Compilers Daten in die Ausführbare Datei zu bringen. Soweit ich weis werden auch wxWidgets-Programme ganz normal mit dem gcc übersetzt.

ScottManDeath
2008-03-30, 08:50:15
QT hat einen extra Resourcencompiler der aus resourcen Dateien eine .cpp Datei erstellt die die Daten (als char array) mitsamt Metainformationen (wie z.B. Dateinamen) enthält.

Sollte nicht so schwer sein sowas selbst zu bauen.

squall23
2008-03-30, 16:43:53
QT hat einen extra Resourcencompiler der aus resourcen Dateien eine .cpp Datei erstellt die die Daten (als char array) mitsamt Metainformationen (wie z.B. Dateinamen) enthält.

Sollte nicht so schwer sein sowas selbst zu bauen.

Verstehe. Danke schonmal für diese Info. Ist euch etwas ähnliches für GTK(mm) bekannt?

Ectoplasma
2008-03-30, 20:32:41
QT hat einen extra Resourcencompiler der aus resourcen Dateien eine .cpp Datei erstellt die die Daten (als char array) mitsamt Metainformationen (wie z.B. Dateinamen) enthält.

Sollte nicht so schwer sein sowas selbst zu bauen.

Was nicht schwer? Dann beschreibe mal, was du damit genau meinst, wenn du schon einen Resourcencompiler erwähnst. Soll man den jetzt selber bauen oder wie? Auch wenn du es nicht glaubst, aber genau dieses habe ich schon einmal getan, inklusive eines vollständigen Preprozessors, den du z.B. für Windows Resourcen benötigst. Jedenfalls dauert die Entwicklung sehr lange.

ScottManDeath
2008-03-30, 23:45:41
Als Resourcen Compiler verstehe ich ein Programm welches es erlaubt den Inhalt beliebiger Dateien direkt in die .exe / .dll Datei einzubinden und dann mit einer minimalen API zur Laufzeit zu laden.

Das ist der Code vom QT/KDE Resource Compiler, 1000 LOC:

http://websvn.kde.org/trunk/qt-copy/src/tools/rcc/

Der macht noch ein bischen mehr, wie z.B. Kompression und Integration ins QT Dateisystem, aber das ist Luxus.

Ectoplasma
2008-03-31, 08:09:58
Danke für den Link.

Der Resourcen Compiler bindet aber keine Resourcen in eine Exe ein. Das macht wenn schon der Linker, zumindest unter Windows. Für Unix Systeme ist mir dieses Prinzip nicht bekannt. Natürlich kann man soetwas nachbauen. Der einfachste Weg scheint tatsächlich der zu sein, einfach ein C/C++ File zu generieren.

squall23
2008-03-31, 10:48:51
Ich hab jetzt nochmal Google zum Thema Resource Compiler befragt. Allerdings scheint es abgesehen vom Qt Resource Compiler nichts portables zu geben. Falls jemand was anderes weis, bitte sagen.

squall23
2008-05-31, 15:29:00
Ich hole mal wieder diese Leiche aus dem Keller.

Mal eine Grundlagenfrage für den Fall, wenn man sich wirklich sowas selbst erstellen will. Die Daten als Felder in die Anwendung zu kompilieren und darauf zuzugreifen wäre ja nicht das Problem. Interessant wäre es erst, wenn man es schafft auch bestehende Librarys mit diesen Daten zu füttern. Man könnte nun natürlich immer beim Programmstart die Dateien aus der Anwendung extrahieren und dann von der Platte laden, aber wirklich schön ist das auch nicht. Kann man nicht die Dateizugriffs -funktionen/-methoden insofern neu definieren, dass sie die Dateien direkt laden können? Mit welchem Aufwand wäre das möglich?

mfg squall23

Gast
2008-06-01, 04:10:03
Wieso bindet ihr das ganze nicht einfach in ein char Array in eine C++ Datei ein?

Also so:

char bla[] = {Datensalat.....};


Und da 1 Char Wert genau 1 Byte groß ist, sollte es auch kein Problem sein, einfach Binärdaten darin zu speichern.


Das ganze kann natürlich auch in kodierter Form vorliegen.
Und zum enkodieren streamed ihr den Inhalt von bla einfach z.B. an die dekodier Funktionen der libpng wenn es z.B. PNG Image Daten sind.

Gast
2008-06-01, 04:11:31
Das einzige vorrauf ihr dabei achten müßt, ist daß die schließende geschweifte Klammer
mit einem Backslash versehen wird und euer Programm einen Backslash der ein Zeichen darstellt von einem Backslash der Daten darstellt unterscheiden kann.

squall23
2008-06-01, 13:47:15
Wieso bindet ihr das ganze nicht einfach in ein char Array in eine C++ Datei ein?

Also so:

char bla[] = {Datensalat.....};


Und da 1 Char Wert genau 1 Byte groß ist, sollte es auch kein Problem sein, einfach Binärdaten darin zu speichern.


Das ganze kann natürlich auch in kodierter Form vorliegen.
Und zum enkodieren streamed ihr den Inhalt von bla einfach z.B. an die dekodier Funktionen der libpng wenn es z.B. PNG Image Daten sind.

Danke für die Antwort, aber hast du eigentlich die Frage gelesen? Mir geht es darum eben diese Daten, welche in einem Array im Programm liegen, für möglichst alles libs zugänglich zu machen. Hab ich hier geschrieben:

...
Die Daten als Felder in die Anwendung zu kompilieren und darauf zuzugreifen wäre ja nicht das Problem.
...
Kann man nicht die Dateizugriffs -funktionen/-methoden insofern neu definieren, dass sie die Dateien direkt laden können? Mit welchem Aufwand wäre das möglich?
...


Also nochmal anders:
Kann ich die fopen Funktion bzw. die IStream Klasse so überladen/neudefinieren, dass bei der Verwendung kein Unterschied mehr zwischen Dateien auf der Festplatte und Dateien im Programm besteht?

mfg squall23

del_4901
2008-06-01, 14:26:44
Man kann Betriebsystemfunktionen "auswechseln" einige Kopierschutztreiber machen das. Aber das ist ein sehr kompliziertes unterfangen, und ich würde abraten sowas zu tun, wenn man sich nicht sicher ist, was man da gerade macht.

squall23
2008-06-01, 22:34:13
So tief wollte ich ohnehin nicht ansetzten :D. Wenns keine praktikablere Lösung gibt ist die Idee in dieser Form wohl gestorben. Auf jeden Fall Danke für die Information. Falls jemand noch Vorschläge oder Ideen in die Richtung hat immer her damit.