【问题标题】:Making a C program to compile another制作一个 C 程序来编译另一个
【发布时间】:2013-03-04 13:51:29
【问题描述】:

我正在寻找一个程序来编译另一个程序。 目的是使用 exec 运行 gcc。 我必须使用 execve 而我拥有的是:

#include <unistd.h>
#include <sys/types.h>

int main(int argc, char* argv[], char* envp[])
{
  argv[0] = "gcc";
  execve("/usr/bin/gcc" , argv, envp);
  return 0;
}

通过做

gcc -Wall p3p4.c -o run

它编译没有问题,但是在做时

./run p3p1.c

要尝试编译另一个,会发生这种情况:

run: error trying to exec 'cc1': execvp: No such file or directory

编辑:

按照建议,添加行时:

argv[0] = "gcc";

程序成功运行。 感谢您的意见。

【问题讨论】:

  • 为什么不使用Make
  • 你在main 中得到的argv 和你传递给execveargv 需要不同。它需要以空指针终止,argv[0] 通常是正在执行的程序的名称。
  • 你不使用 system() 吗??
  • @slugonamission argv 应该已经被 NULL 指针终止。
  • @slugonamission 该向量已经以 NULL 结尾。

标签: c unix ubuntu


【解决方案1】:

尝试将argv[0] 设置为行为良好的程序:

argv[0] = "gcc";
execve("/usr/bin/gcc" , argv, envp);

运行:尝试执行“cc1”时出错:

这显然是 gcc 在 argv[0] 中发现意外时尝试运行的内容。

【讨论】:

  • 这似乎适用于 Hello World!程序,但提出了一个新问题。我会编辑帖子。
【解决方案2】:

excve 告诉你他没有找到gcc。试试

execvpe ("gcc", argv, envp);

注意这里envp 是无用的(而不是POSIX);您可以安全地从main() 中删除envp 并调用

execvp ("gcc", argv);

【讨论】:

    猜你喜欢
    • 2022-07-09
    • 1970-01-01
    • 2010-10-25
    • 2011-07-24
    • 1970-01-01
    • 2010-10-08
    • 2013-08-22
    • 1970-01-01
    • 2019-04-14
    相关资源
    最近更新 更多