有没有办法将gcc用作库?


10

任何人都知道这样的解决方案:

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

我知道我可以在fork中运行命令“ gcc main.c -o main”并解析输出...但是我一直在寻找更“ 可靠 ”的东西,例如上面的示例。

Answers:




3

使用gcc是不可能的,但是您可能会发现tcc(可嵌入的C编译器)足以满足您的需求。该发行版附带一个libtcc库,该库允许“即时”编译,链接和运行C代码。

请注意,这仅针对C语言,您的问题也被标记为C ++语言,但我没有看到tcc语言等效于C ++语言。


请注意,tcc编译速度很快,但根本没有优化。生成的代码通常比生成的代码慢3到10倍gcc -O2
Basile Starynkevitch


2

(我猜您在某些POSIX系统上,例如Linux或MacOSX)

正如Ciro Santilli提到的,您显然应该研究GCCJIT。然后,您将生成一些类似AST的表示形式的代码。当然,你可能会考虑LLVM代替,甚至一些简单的JIT库像libjitGNU闪电(但并是快速发射的代码,但发射代码是缓慢的,未优化)。libjitlightning

但是,您仍然可以考虑在临时文件中发出一些C代码并对其进行分叉(例如,作为共享库,您稍后将使用dlopen(3)dlsym(3)作为插件动态加载),请参见此处此处有关详细信息。

请注意一个重要的事实:生成优化的代码会花费CPU时间(使用GCCJIT或LLVM或通过运行gcc -O2),因为这是一项艰巨的任务。因此,派生一个gcc进程(或使用其他编译器,如clang)的开销可以忽略不计(使用诸如GCCJIT或LLVM之类的库来减少开销)。

实际上,我的经验(在GCC MELT中)是,在当前的台式机和笔记本电脑上,发出几百行C代码并分叉它们的编译足够快(十分之一或十分之二秒)以与用户交互兼容。因此,今天,您可以考虑使用REPL来做到这一点。另请参阅相关答案。

还要查看Common LispSBCL,它是在每次REPL交互时都编译成机器代码的实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.