2012-04-05 12 views
5

La única forma que conozco de hacerlo es convertir el archivo en un archivo fuente C con una matriz de un solo byte/char que contenga el contenido del archivo de recursos en hexadecimal.¿Cómo incrusta archivos de recursos en C?

¿Hay una manera mejor o más fácil de hacer esto?

+5

¿Sobre qué plataforma? –

+0

@OliCharlesworth: me estoy ejecutando en un RTOS incorporado patentado, usando Eclipse 3.0.2 – theanine

+2

Afortunadamente, sabrá que la respuesta a este problema depende ** completamente ** de los detalles de la cadena de herramientas que está utilizando (compilador, enlazador, formato ejecutable, etc.). Así que haría bien en agregar tantos detalles como sea posible a su pregunta. –

Respuesta

3

He aquí un buen truco que uso con un compilador cruzado gcc-arm; incluyendo un archivo a través de un archivo de lenguaje ensamblador. En este ejemplo, es el contenido del archivo public_key.pem que estoy incluyendo.

pubkey.s

.section ".rodata" 
.globl pubkey 
.type pubkey, STT_OBJECT 
pubkey: 
.incbin "public_key.pem" 
.byte 0 
.size pubkey, .-pubkey 

correspondiente pubkey.h

#ifndef PUBKEY_H 
#define PUBKEY_H 
/* 
* This is a binary blob, the public key in PEM format, 
* brought in by pubkey.s 
*/ 
extern const char pubkey[]; 

#endif // PUBKEY_H 

Ahora las fuentes de C pueden incluir pubkey.h, compilar el pubkey.s con gcc y vincularlo a su aplicación, y ahí tienes. sizeof(pubkey) también funciona.

+1

Awesome answer. Gracias. – theanine

+0

¿Cómo funciona sizeof? ¿No se evalúa sizeof en tiempo de compilación, donde ni siquiera se considerarán los contenidos de pubkey.s? EDIT: ¿Te refieres a strlen? – thenickdude

2

La forma que ha descrito es la mejor/más fácil/más portátil. Simplemente escriba una herramienta rápida (o encuentre una herramienta existente) para generar los archivos C por usted. Y asegúrese de hacer un uso correcto de las palabras clave const (y posiblemente static) cuando lo haga o su programa perderá grandes cantidades de memoria.

0

Hace tiempo necesitaba algo como esto y creé una herramienta para esto. Es una herramienta de python llamada mkcres (https://github.com/jahnf/mkcres) y la puse en github.

  • Aunque la documentación es deficiente, hay ejemplos de cómo integrarla en un proceso de compilación con CMake o archivos de creación simple.
  • Toma un archivo .json como configuración de generación de archivos de recursos
  • Puede detectar cambios en los archivos de recursos y regenerar automáticamente los archivos C correspondientes si es necesario.
  • Desventaja: Necesitará python (2 o 3)
  • Al revés: No es específico del compilador, debería funcionar con cada compilador de C/C++.
Cuestiones relacionadas