编译并运行一串C源代码

编译并运行一串C源代码,c,gcc,C,Gcc,因此,我想编译并运行一个C源代码字符串,其中该字符串是一个const char*,表示整个程序。它应该取自常量或构造的字符串,例如 const char* prog = "#include <stdio.h> int main(void) {puts(\"foo\"); return 0;}" const char*prog=“#include int main(void){put(\'foo\”);返回0;}” 我已经尝试过了,但目前它并没有建立在Mac OS上,而且由于缺乏一

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

const char* prog = "#include <stdio.h> int main(void) {puts(\"foo\"); return 0;}"
const char*prog=“#include int main(void){put(\'foo\”);返回0;}”
我已经尝试过了,但目前它并没有建立在Mac OS上,而且由于缺乏一致的维护人员,我认为这不是一个可行的方法

我主要想问的是,这是一种为编译成C的编程语言提供后端的方法。如果在
gcc
clang
中有一些库函数,那也可以

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


@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);
}
#包括
#包括
const char*prog=“#include\nint main(void){put(\'foo\”);返回0;}”;
int main(){
文件*proc=popen(“gcc-xc-”,“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");
    }
}
#包括
#包括
const char*prog=“#include\nint main(void){put(\'foo\”);返回0;}”;
int main(){
文件*proc=popen(“gcc-xc-”,“w”);
如果(!proc){
perror(“popen gcc”);
}
fwrite(prog,sizeof(char),strlen(prog),proc);
如果(费罗(过程)){
perror(“编写程序”);
}
如果(pclose(proc)=-1){
perror(“pclose gcc”);
}
}

我认为这是实现这一点的最佳方式。

为什么不将字符串写入文件并调用编译器?为什么不将该字符串写入文件,然后要求编译它,然后运行exe?如果安装了gcc,问题出在哪里?我几乎肯定我以前见过这个问题(或非常类似的问题),但当前标记为重复的问题似乎不是它。这个问题是关于从C代码编译C代码,而不是获取一个代码字符串并将其注入进程。@bruno我的想法是不必处理不同的windows和unix路径名(windows utf-16路径名)。但也许仅仅调用gcc是一个更好的解决方案。因此原则上,gcc有一个实验性的编程接口,LLVM被设计为更易于访问。从这个意义上说,您可以在谷歌上找到更多关于“将clang/LLVM用作库”(如)的信息。