C'è un modo per usare gcc come libreria?

10

Qualcuno conosce una soluzione che funziona in questo modo:

#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;
}

So che posso eseguire il comando "gcc main.c -o main" in un fork e analizzare l'output ... ma stavo cercando qualcosa di più affidabile come nell'esempio sopra .

    
posta ffunenga 09.03.2013 - 19:57
fonte

5 risposte

10

GCC è stato progettato esplicitamente per resistere all'utilizzo come base / libreria di strumenti. È necessario utilizzare Clang per questo, o chiamare GCC tramite riga di comando.

    
risposta data 09.03.2013 - 21:11
fonte
4

libgccjit

Introdotto in GCC 5 ed è ancora sperimentale a partire da GCC 6.

Documenti: link

Domande correlate:

risposta data 02.07.2016 - 11:39
fonte
3

Non è possibile con gcc ma potresti trovare tcc (un compilatore C incorporabile) abbastanza buono per quello che hai in mente. La distribuzione viene fornita con una libreria libtcc che consente di compilare, collegare ed eseguire il codice C "al volo".

Si noti che questo solo per C, la tua domanda è anche codificata in C ++ ma non ho visto alcun equivalente di tcc per C ++.

    
risposta data 09.03.2013 - 20:46
fonte
2

Dubito che ci sia qualcosa di meglio che lanciare gcc. Potresti considerare clang, che è più progettato per questo tipo di utilizzo.

    
risposta data 09.03.2013 - 21:00
fonte
2

(Credo che tu sia su un sistema POSIX, come Linux o MacOSX)

Ovviamente dovresti esaminare GCCJIT , come menzionato da Ciro Santilli . Quindi creerai una AST -come rappresentazione del codice generato. Ovviamente potresti prendere in considerazione LLVM invece, o anche alcuni più semplici JIT libreria come libjit o GNU lightning (ma libjit e lightning stanno emettendo rapidamente codice, ma il codice emesso è lento e non ottimizzato).

Tuttavia, potresti ancora considerare emettere un codice C in un file temporaneo e creare una compilazione di esso ( ad es. come libreria condivisa che successivamente caricheresti in modo dinamico come plug-in usando dlopen (3) & dlsym (3) ), vedi qui & qui per i dettagli.

Nota un fatto importante: generare codice ottimizzato richiede tempo CPU (con GCCJIT o LLVM o eseguendo gcc -O2 ) perché è un compito difficile. Quindi il sovraccarico di un processo di gcc di fork (o l'utilizzo di qualche altro compilatore, come clang ) è trascurabile (ad esempio usando alcune librerie come GCCJIT o LLVM).

In realtà, la mia esperienza (in GCC MELT ) è quella su desktop e laptop correnti, che emettono poche centinaia di righe di codice C e forking una loro compilation è abbastanza veloce (uno o due decimi di secondo) per essere compatibile con l'interazione dell'utente. Quindi oggi potresti prendere in considerazione un REPL che lo farebbe. Vedi anche questa risposta correlata.

Guarda anche Common Lisp e SBCL che è un'implementazione che compila in codice macchina ad ogni interazione REPL.

    
risposta data 02.07.2016 - 12:31
fonte

Leggi altre domande sui tag