编译并运行一串C源代码

时间:2019-01-07 17:26:24

标签: c gcc

因此,我想编译并运行一串C源代码,其中该字符串是const char*,代表整个程序。它应该从常量或构造的字符串中获取,例如

const char* prog = "#include <stdio.h> int main(void) {puts(\"foo\"); return 0;}"

我已经尝试过tcclib,但是它目前无法在Mac OS上构建,并且由于缺乏一致的维护者,我认为这不是可行的方法。

我主要是想以此作为拥有可编译为C的编程语言的后端的方法。如果gccclang中有一些库函数,那也将起作用。 / p>

注意:这特别是关于从C编译C代码,而不是将其注入到进程中。

1 个答案:

答案 0 :(得分:1)

  

@bruno我的想法是不必处理不同的Windows和UNIX路径名(Windows utf-16路径名)。但是也许只调用gcc是一个更好的解决方案。

我认为致电GCC最简单。但是,仅仅因为您将GCC作为外部进程调用,并不意味着您必须将生成的C写入文件。

GCC能够从标准输入中获取其输出。这是一个用Bash编写的示例。

echo "main(){}" | gcc -x c -

这是C语言中的一件事:

#include <stdio.h>
#include <string.h>

const char *prog = "#include <stdio.h>\nint main(void) {puts(\"foo\"); return 0;}";

int main() {
    FILE *proc = popen("gcc -x c -", "w");
    fwrite(prog, sizeof(char), strlen(prog), proc);
    pclose(proc);
}

这是同一件事,但是有错误处理:

#include <stdio.h>
#include <string.h>

const char *prog = "#include <stdio.h>\nint main(void) {puts(\"foo\"); return 0;}";

int main() {
    FILE *proc = popen("gcc -x c -", "w");
    if(!proc) {
        perror("popen gcc");
    }
    fwrite(prog, sizeof(char), strlen(prog), proc);
    if(ferror(proc)) {
        perror("writing prog");
    }
    if(pclose(proc) == -1) {
        perror("pclose gcc");
    }
}

我认为这是完成此任务的最佳方法。