因此,我想编译并运行一串C源代码,其中该字符串是const char*
,代表整个程序。它应该从常量或构造的字符串中获取,例如
const char* prog = "#include <stdio.h> int main(void) {puts(\"foo\"); return 0;}"
我已经尝试过tcclib,但是它目前无法在Mac OS上构建,并且由于缺乏一致的维护者,我认为这不是可行的方法。
我主要是想以此作为拥有可编译为C的编程语言的后端的方法。如果gcc
或clang
中有一些库函数,那也将起作用。 / p>
注意:这特别是关于从C编译C代码,而不是将其注入到进程中。
答案 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");
}
}
我认为这是完成此任务的最佳方法。