Est-il un équivalent Linux de Windows' “fichiers de ressources”?
J'ai une bibliothèque C, que j'ai construire comme un objet partagé pour Linux et une DLL pour Windows avec MinGW32. L'API dépend d'un couple de fichiers de données (modèles statistiques) qui je tiens vraiment à les rouler dans le SO/DLL afin que le déploiement est juste un fichier.
On dirait que je puisse réaliser ce pour Windows avec un "fichier de ressources" compilé avec windres
, mais ensuite, j'ai à écrire un tas de ressources de manipulation de code pour Windows, et je suis toujours coincé avec les fichiers sur Linux.
Est-il un moyen pour obtenir la même fonctionnalité sur Linux?
Encore mieux, est-il une solution portable?
- Similaire (possible dup): stackoverflow.com/questions/1656968/... et peut-être d'autres, mais c'est un difficile sujet de la recherche...
- Pas de vote pour fermer, cependant, la réponse à la question existante ne sont que peu utiles.
- Il aiderait énormément si vous pouviez nous dire ce qu' (portable) code que vous voulez écrire pour obtenir l'accès aux fichiers de données.
fopen
etfread
simplement ne fonctionnera pas sur les blocs de la mémoire, du moins pas sur n'importe quel système je suis au courant de. - Je suis à l'aide de C++ pour mettre en œuvre la bibliothèque (bien qu'il n'exporte que les fonctions C, pour ABI compatibilité) donc je peux juste à construire une
stringstream
à partir de données binaires et puis, il agit comme un fichier de toute façon. Il est également intéressant de noter que, avec l'avr-libc (et probablement d'autres libcs ciblées sur les microcontrôleurs) vous pouvez réellement fairefread()
de travail sur l'arbitraire des blocs de mémoire (ou autre chose) en fournissant votre propregetc()
etputc()
via des pointeurs de fonction à lafdevopen()
fonction (fopen()
n'a pas beaucoup de sens sans un OS, et encore moins un système de fichiers). - Double Possible de C/C++ avec GCC: Statique ajouter des fichiers de ressources de l'exécutable/library
InformationsquelleAutor cibyr | 2010-01-04
Vous devez vous connecter pour publier un commentaire.
Il est en fait assez simple sur Linux et d'autres systèmes ELF: http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967
OS X dispose de faisceaux, de sorte que vous venez de construire votre bibliothèque en tant que cadre et placez le fichier dans le bundle.
objcopy
; vous pouvez facilement écrire un petit script qui génère un .c fichier à partir d'un fichier binaire. E. g., cs.tufts.edu/~nr/drop/lua/lua2c; exécuter le script avec l'option-s.$PREFIX/share
mais apparemment, OP n'aime pas trop.)$PREFIX/share
solution est parfaite pour UNIX, où tout le monde est utilisé pour l'installation de dépendances, mais sur Windows les gens veulent tout simplement une DLL qu'ils peuvent redistribuer à leur application (et il n'y a pas un bon équivalent de$PREFIX/share
de toute façon).istream&
vous pouvez facilement passer uneifstream
ou unistringstream
(ou d'autre chose, à vous d'imaginer).#ifdef WIN32
macro, mais vous pourriez probablement faire encore plus portable en test avec/avec le trait de soulignement dans votre script de configuration (je suis en utilisant CMake). Si je pouvais modifier cette réponse que je voudrais inclure plus de détails (ce que j'ai mis dans CMakeLists.txt, la construction destringstream
s à partir de l'intégré de données, etc).ld
queobjcopy
, parce qu'il n'a pas besoin d'être compte tenu de la forme. Voir stackoverflow.com/a/4158997/201725.Deux solutions possibles:
Phong Vo du sfio de la bibliothèque, qui fait partie de l'AT&T Logiciel de pointe de la Technologie, l'ensemble d'outils, est un merveilleux remplacement pour C
stdio.h
, et il vous permettra d'ouvrir des fichiers ou des blocs de mémoire à l'aide d'une API unique. Donc, vous pouvez facilement convertir vos fichiers existants vers C initialisé données à inclure dans votre fichier DLL, ou SI le fichier.C'est une bonne solution multi-plateforme, mais la peine est celle de la courbe d'apprentissage pour commencer, c'est assez élevé. Ils ne font pas, il est facile de comprendre comment ça marche ou de prendre une partie de leur ensemble d'outils et de le diviser pour utilisation indépendante des autres parties. Mais la bonne nouvelle est que si vous voulez adopter leur U/Win système Unix codes sur windows (toutes partie du même ensemble d'outils), vous pouvez créer des Dll et des SOs en utilisant le même système.
Pour ce genre de problème que j'ai souvent retomber sur Lua; je peux stockées Lua données dans des fichiers externes ou au sein de la C comme données initialisées. Ce qui est excellent pour la distribution tout en un .si le fichier; je fais cela pour mes élèves.
De nouveau l'inconvénient est que vous devez maîtriser et d'intégrer une nouvelle technologie.
Dans mon propre travail, j'utilise Lua sur le AT&T des choses pour ces raisons:
Lua a un beaucoup plus petite empreinte de pas et est conçu pour bien jouer avec les autres; avec AST vous avez vraiment le faire adopter leur façon de faire les choses.
La courbe d'apprentissage avec Lua est beaucoup moins raide; vous pouvez être productif très rapidement.
Lua est morte facile à installer et il est facile d'obtenir des informations à ce sujet. AST a son propre excentrique processus d'installation partagé par personne d'autre dans le monde; il est souvent difficile de faire les travaux d'installation; et il est plus difficile d'obtenir des informations à ce sujet.
À l'aide de Lua a beaucoup d'autres paiements, de sorte que l'effort consacré à l'apprentissage de Lua et apprendre à intégrer Lua dans les codes C est facile à amortir sur plusieurs projets.
lua2c
qui peut vous donner quelques idées. Courir avec le-s
option et il va intégrer n'importe quel fichier binaire, même si c'est pas super utile depuis l'API, j'ai généré un essaie de compiler le fichier de code Lua. Mais une fois que vous décidez ce que l'API vous voulez, je suis sûr que vous pouvez faire quelque chose en Python. Si non, afficher une autre question.