2009-12-15 11 views
6

¿Existe un sistema de recursos independiente de plataforma para C++ como el que viene con Qt (pero sin la dependencia de Qt)?Sistema de recursos independiente de plataforma (como el sistema de recursos de Qt)

Me gustaría acceder a datos arbitrarios desde mi código fuente de C++. Es decir, no solo iconos sino también traducciones o sombreadores, etc.

Alternativamente, algún tipo de biblioteca de sistema de archivos virtual para acceder, p. un archivo ZIP comprimido o similar también se ajustaría a mis necesidades.

+0

¿Deben incrustarse los recursos en su ejecutable? Si no, entonces otra ruta podría estar usando SQLite para almacenar los archivos; la puesta en marcha con esta base de datos liviana no supondría demasiado esfuerzo. – Rob

+0

Similar: http://stackoverflow.com/questions/549031/how-do-you-include-images-as-resources-in-ac-c-executable – Rob

Respuesta

8

Implementé mi propio sistema para un proyecto de servidor web C++ que básicamente tomó un montón de archivos (HTML, CSS, JS, PNG, etc.) y creó encabezados C++ que contienen los datos codificados como static const char*. Luego #include esos encabezados donde necesito acceder a los datos. La aplicación que codifica los archivos de 'recursos' se ejecuta como un paso previo a la compilación. La aplicación de codificación usó boost::filesystem para crear los encabezados de los recursos, por lo que funciona en Windows/* nix.

Un archivo de recursos típico podría tener este aspecto:

namespace resource 
{ 
    // Generated from mainPage.htm 
    static const char* mainPage_[] = 
    { 
    "<html>...</html>" 
    }; 
} 

Para el contenido binario que codifican usando la notación \x. También me aseguro de alinear los datos para que sean legibles en un editor.

Tuve algunos problemas: el compilador MS no permite que un static const char* sea más grande que 64Kb que era un PITA. Afortunadamente, los únicos archivos más grandes que esto eran archivos JavaScript que podía dividir fácilmente en trozos más pequeños, sin embargo, las imágenes grandes serían un problema.

+0

y ¿por qué harías eso? –

+4

Porque no pude encontrar un sistema de recursos de Qt multiplataforma, es por eso. Le di a la pregunta una respuesta sensata y me votaste por ella? ¡Gracias! – Rob

0

Estamos usando ICU ResourceBundle s para eso y estamos muy satisfechos con él.

Usando el pkgdata tool, el paquete de ResourceBundles es bastante flexible: como biblioteca compartida, biblioteca estática o como archivos que la ICU puede mapear en memoria.

0

Acabo de parchearlos en el extremo del ejecutable en el momento del enlace como un blob binario. Con los últimos 4 bytes es el tamaño del bloque anterior y luego haga que el programa lea los elementos de datos de la cola.

Otro enfoque si necesita una estructura de tipo de sistema de archivos más (aunque no lo he probado) sería poner todo en un archivo zip y anexarlo hasta el final. De nuevo, necesitaría algún tamaño de archivo de los datos agregados fácilmente.

Cuestiones relacionadas