compiling and running a c program using exec()

时间:2016-02-12 19:55:36

标签: c linux ubuntu gcc cc

I am writing a program using execv() that compiles and runs another program. I've written up a simple C program named helloWorld.c that when executed outputs, "Hello world," and a second file named testExec.c that is supposed to compile and run helloWorld.c. I've been looking around everywhere to find a way to do this, but I haven't found any answers. The code in testExec.c is:

#include <stdio.h>
#include <unistd.h>
int main(){
   char *args[] = {"./hellWorld.c", "./a.out", NULL};
   execv("usr/bin/cc", args);
   return 0;
}

testExec.c compiles with no errors. However, when I run it I get an error that says, "fatal error: -fuse-linker-plugin, but liblto_plugin.so not found. compilation terminated." Which I think means helloWorld.c is being compiled but when it comes time to run helloWorld.c this error is thrown. I thought maybe that was because I had a.out and helloWorld.c prefaced with './'. I removed './' from both, then either one individually, and still no luck.

I also did 'sudo apt-get install build-essential' along with 'sudo apt-get install gcc'. I wasn't sure if that would resolve the issue but I really wasn't sure what else to try. Anyway, any help would be appreciated!

1 个答案:

答案 0 :(得分:1)

You're missing the leading slash when calling cc.

Also, the first argument in the argument list is the name of the executable. The actual arguments come after that. You're also not using -o to specify the name of the output file.

#include <stdio.h>
#include <unistd.h>
int main(){
   char *args[] = {"cc", "-o", "./a.out", "./hellWorld.c", NULL};
   execv("/usr/bin/cc", args);
   return 0;
}

EDIT:

The above only compiles. If you want to compile and run, you can do this:

#include <stdio.h>
#include <unistd.h>
int main(){
   system("cc -o ./a.out ./hellWorld.c");
   execl("./a.out", "a.out", NULL);
   return 0;
}

Although this is probably best done as a shell script:

#!/bin/sh

cc -o ./a.out ./hellWorld.c
./a.out