2010-01-04 7 views
29

Ich habe eine C-Bibliothek, die ich als ein gemeinsames Objekt für Linux und eine DLL für Windows mit MinGW32 erstellen. Die API hängt von einigen Datendateien (statistischen Modellen) ab, die ich gerne mit der SO/DLL einspielen würde, so dass die Bereitstellung nur eine Datei ist.Gibt es ein Linux-Äquivalent von Windows "Resource Files"?

Es sieht so aus, als könnte ich dies für Windows mit einer "Ressourcendatei" erreichen, kompiliert mit windres, aber dann muss ich eine Menge Resource-Handling-Code für Windows schreiben, und ich bin immer noch mit den Dateien fest unter Linux.

Gibt es eine Möglichkeit, die gleiche Funktionalität unter Linux zu erreichen?

Noch besser, gibt es eine tragbare Lösung?

+1

Ähnliche (mögliche dup): http://Stackoverflow.com/questions/1656968/platform-independant-resource-management und möglicherweise andere, aber es ist ein schweres Thema zu suchen ... – dmckee

+0

Nicht stimmen für schließen, obwohl , die Antwort auf die bestehende Frage ist nur am Rande nützlich. – dmckee

+0

Es würde enorm helfen, wenn Sie uns mitteilen würden, welchen (portablen) Code Sie schreiben möchten, um auf die Datendateien zugreifen zu können. 'fopen' und' fread' funktionieren einfach nicht auf Speicherblöcken, zumindest nicht auf irgendeinem mir bekannten System. –

Antwort

27

Es ist eigentlich ganz einfach auf Linux und anderen ELF-Systeme: http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967

OS X Bündel hat, so dass Sie nur Ihre Bibliothek als Rahmen bauen und die Datei in dem Bündel setzen.

+0

Funktioniert dieser Ansatz auch zum Erstellen von Windows-DLLs? Es scheint eine gute, einfache Option zu sein. – cibyr

+0

Ich habe keine Ahnung, ich habe nie etwas für Windows gebaut und weiß nichts darüber, wie der Linker funktioniert. –

+0

Sie haben immer noch das Problem, dass die API für den Zugriff auf Daten in einer Datei sich von der API für den Zugriff auf einen benannten Block im Speicher unterscheidet. Aber wenn Sie damit leben können, brauchen Sie nicht "objcopy"; Sie können einfach ein kurzes Skript schreiben, das eine .c-Datei aus einer beliebigen Binärdatei generiert. Zum Beispiel http://www.cs.tufts.edu/~nr/drop/lua/lua2c; Führen Sie das Skript mit der Option -s aus. –

0

Zwei mögliche Lösungen:

  • Phong Vos sfio Bibliothek, die Teil des AT & T Erweiterte Software Technology Toolset ist, ist ein wunderbarer Ersatz für C stdio.h, und es erlaubt Ihnen, entweder Dateien zu öffnen oder Speicherblöcke, die eine einzelne API verwenden. So können Sie Ihre vorhandenen Dateien einfach in C initialisierte Daten konvertieren, um sie in Ihre DLL- oder SO-Datei aufzunehmen.

    Dies ist eine gute Cross-Plattform-Lösung, aber die Strafe ist, dass die Lernkurve, um zu beginnen, ziemlich hoch ist. Sie machen es nicht einfach, herauszufinden, wie etwas funktioniert, oder einen Teil ihres Toolsets zu nehmen und es für den Gebrauch unabhängig von den anderen Teilen aufzuteilen. Aber die gute Nachricht ist, dass wenn Sie ihr U/Win-System für die Ausführung von Unix-Codes in Windows (alle Teil des gleichen Toolsets) verwenden möchten, können Sie DLLs und SOs mit dem gleichen System erstellen.

  • Für diese Art von Problem ich oft auf zurückgreifen; Ich kann Lua-Daten entweder in externen Dateien oder in C als initialisierte Daten speichern. Dies ist ideal, um alles in einer .so-Datei zu verteilen. Ich mache das für meine Studenten.

    Der Nachteil ist wiederum, dass Sie eine neue Technologie beherrschen und integrieren müssen.

In meiner eigenen Arbeit verwende ich Lua über das AT & T Sachen aus diesen Gründen:

  • Lua eine viel kleinere Grundfläche hat und ist so konzipiert, mit anderen gut zu spielen; Mit AST haben Sie wirklich ihre Art, Dinge zu tun.

  • Die Lernkurve mit Lua ist viel weniger steil; Sie können sehr schnell produktiv sein.

  • Lua ist kinderleicht zu installieren und es ist leicht, Informationen darüber zu erhalten. AST hat seinen eigenen schrulligen Installationsprozess, den niemand sonst auf der Welt teilt. Es ist oft schwierig, die Installation zu machen. und es ist schwieriger, Informationen darüber zu bekommen.

  • Die Verwendung von Lua hat viele andere Vorteile, so dass sich die Mühe, Lua zu lernen und zu lernen, wie man Lua in C-Codes einbaut, leicht über mehrere Projekte hinweg amortisieren kann.

+0

Ich sehe nicht, wie die Einbettung einer Skriptsprache das Problem der Einbettung beliebiger Dateidaten löst, und wenn ich eine Skriptsprache einbetten würde, würde ich wahrscheinlich mit Python gehen (seit ich Boost.Python benutzt habe) in letzter Zeit jedenfalls). sfio sieht praktisch aus, aber es sieht so aus, als wäre es wahrscheinlich nicht die Mühe wert, alles zu refactoring verwenden Sie es. – cibyr

+0

@cibyr: Mein Asnwer geht davon aus, was einzubetten ist und nicht, wie man es einbetten kann. Wie man eine Datei als C-Code einbindet, ist sehr, sehr einfach; Der ganze Gedanke geht auf die Frage ein, welche API für die Bytes gewünscht wird. Wenn Sie in http://www.cs.tufts.edu/~nr/drop/lua nachsehen, werden Sie ein Skript namens 'lua2c' sehen, das Ihnen einige Ideen geben kann. Führen Sie mit der Option "-s" und es wird jede Binärdatei einbetten, obwohl es nicht sehr nützlich ist, da die API, die ich generierte, versucht, die Datei als Lua-Code zu kompilieren. Aber sobald Sie sich entscheiden, welche API Sie wollen, können Sie sicher etwas in Python machen. Wenn nicht, posten Sie eine andere Frage. –

+4

Ich bin mir nicht sicher, wie dies entfernt nahe kommt, um die OP-Frage zu beantworten, "es gibt eine Möglichkeit, Ressourcendateien mit meiner ausführbaren Datei hinzuzufügen" (meine Interpretation). Bisher erscheint die Objkopie-Route viel vernünftiger als die Einbettung von Lua. –

Verwandte Themen