【问题标题】:How to write a C program that compiles other C programs using GCC?如何编写一个使用 GCC 编译其他 C 程序的 C 程序?
【发布时间】:2014-11-18 01:11:13
【问题描述】:

我希望我的程序执行与以下终端命令相同的操作:

gcc program1.c -o p1 funcs.c

gcc program2.c -o p1 funcs.c

这是我一直在尝试的:Making a C program to compile another

到目前为止,我在终端中调用了我的程序 (./"programName"),它取代了我也需要输入 gcc,但需要我也输入其余部分。

【问题讨论】:

  • 太宽泛了..需要付出很多努力。
  • “这是我一直在尝试的”。你遇到了什么问题?目前尚不清楚您的实际问题是什么。

标签: c ubuntu-14.04


【解决方案1】:

您可以使用 Linux 和 POSIX API,因此请先阅读 Advanced Linux Programming 和 intro(2)

您可以使用system(3) 运行编译命令,您可以使用snprintf(3) 来构建命令字符串(但要注意code injection);例如

void compile_program_by_number (int i) {
   assert (i>0);
   char cmdbuf[64];
   memset(cmdbuf, 0, sizeof(cmdbuf));
   if (snprintf(cmdbuf, sizeof(cmdbuf),
               "gcc -Wall -g -O program%d.c fun.c -o p%d",
               i, i) 
         >= sizeof(cmdbuf)) {
       fprintf(stderr, "too wide command for #%d\n", i);
       exit(EXIT_FAILURE);
   };
   fflush(NULL); // always useful before system(3)
   int nok = system(cmdbuf);
   if (nok) {
      fprintf(stderr, "compilation %s failed with %d\n", cmdbuf, nok);
      exit(EXIT_FAILURE);
   }
} 

顺便说一句,你的程序可能会生成一些 C 代码,然后是 fork + execve + waitpid gcc 编译器(或 make),然后甚至可能是 dlopen(3) 编译的结果(你'将需要gcc -fPIC -shared -O foo.c -o foo.so 来编译dlopenable 共享对象...)。 MELT 正是这样做的。 (我的manydl.c也是如此,这表明你可以做很多dlopen-s ...)

【讨论】:

    【解决方案2】:

    可以使用exec家族函数,也可以使用system()方法直接执行shell命令

    【讨论】:

      【解决方案3】:

      Makefile 中有内置功能。

      您只需拨打make。

      如何:http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/

      很棒的stackoverflow问题:How do I make a simple makefile for gcc on Linux?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-11
        • 1970-01-01
        • 2014-03-03
        • 1970-01-01
        • 2011-01-03
        • 1970-01-01
        • 2022-07-09
        • 2010-10-08
        相关资源
        最近更新 更多