¿Hay alguna manera de usar gcc como biblioteca?


10

Alguien conoce una solución que funciona más o menos así:

#include <stdio.h>
#include <gcc.h> /* This .h is what I'm looking for. */

int main (void) {
    /* variables declaration (...) */

    /* The following line is supposed to be equivalent to:
     *     $ gcc main.c -o main */
    results = gcc_compile_and_link("main.c", "main");

    /* Now I want to use the warnings and errors to do something.
     * For instance, I'll print them to the console: */
    printf("warnings:\n");
    for (i=0; i<results.warns_len; i++)
        printf("%s\n", results.warings[i].msg);
    printf("errors\n");
    for (i=0; i<results.errs_len; i++)
        printf("%s\n", results.errors[i].msg);

    /* free memory and finalize (...) */
    return 0;
}

Sé que puedo ejecutar el comando "gcc main.c -o main" en una bifurcación y analizar la salida ... pero estaba buscando algo más ' confiable ' como el ejemplo anterior.

Respuestas:




3

No es posible con gcc, pero es posible que encuentre tcc (un compilador C incorporable) lo suficientemente bueno para lo que tiene en mente. La distribución viene con una biblioteca libtcc que permite compilar, vincular y ejecutar código C "sobre la marcha".

Tenga en cuenta que esto solo para C, su pregunta también está etiquetada como C ++ pero no he visto ningún equivalente de tcc para C ++.


Tenga en cuenta que se tcccompila rápidamente, pero no se optimiza en absoluto. El código generado suele ser de 3 a 10 veces más lento de lo gcc -O2que produciría.
Basile Starynkevitch

2

Dudo que haya algo mejor que bifurcar gcc. Puede considerar el sonido metálico, que está más diseñado para este tipo de uso.


2

(Supongo que estás en algún sistema POSIX, como Linux o MacOSX)

Obviamente deberías buscar en GCCJIT , como lo menciona Ciro Santilli . Luego construirá una representación similar a AST del código generado. Por supuesto, puede considerar LLVM en su lugar, o incluso alguna biblioteca JIT más simple como libjit o GNU lightning (pero libjity lightningestá emitiendo código rápidamente, pero el código emitido es lento y no optimizado).

Sin embargo, aún podría considerar emitir algún código C en un archivo temporal y bifurcar una compilación del mismo (por ejemplo, como una biblioteca compartida que luego cargaría dinámicamente como un complemento usando dlopen (3) y dlsym (3) ), vea aquí y aquí para detalles.

Observe un hecho importante: generar código optimizado requiere tiempo de CPU (con GCCJIT o LLVM, o al ejecutarse gcc -O2) porque es una tarea difícil. Entonces, la sobrecarga de bifurcar un gccproceso (o usar algún otro compilador, como clang) es insignificante (wrt usando alguna biblioteca como GCCJIT o LLVM).

En realidad, mi experiencia (en GCC MELT ) es que en los equipos de escritorio y portátiles actuales, emitir unos cientos de líneas de código C y bifurcar una compilación de ellas es lo suficientemente rápido (una o dos décimas de segundo) para ser compatible con la interacción del usuario. Así que hoy, podrías considerar tener un REPL que haría eso. Ver también esta respuesta relacionada.

Mire también Common Lisp y SBCL, que es una implementación que se compila en código máquina en cada interacción REPL.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.