Compilare codice c programmaticamente nel terminale Linux gcc

Sto scrivendo ac program su Linux che scrive il testo in un file. Sto avendo problemi dove sto cercando di usare il system("gcc fileName.c") per compilare il nuovo documento che ho creato in un eseguibile. Il file riceve il seguente input:

 char Msg[100] = {"#include \nint main();\n\nint main()\n{\n\n\treturn 0;\n}"}; 

chiaramente ha una funzione main() e tuttavia mi dà ancora il seguente wall of error:

 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 13 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_info): relocation 21 has invalid symbol index 22 /usr/bin/ld: /usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2 /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o: In function `_start': (.text+0x18): undefined reference to `main' collect2: error: ld returned 1 exit status 

Se lo compilo manualmente funziona perfettamente …

Sono molto nuovo a c quindi non sono sicuro di dove mi sbaglio, qualsiasi aiuto sarebbe apprezzato.

MODIFICARE:

Contenuto del file:

 #include  int main(); int main() { return 0; } 

quando usato -c restituisce il contenuto del file:

ELF\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\A0\00\00\00\00\00\00\004\00\00\00\00\00(\00 \00\00\00GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2\00\00.symtab\00.strtab\00.shstrtab\00.text\00.data\00.bss\00.comment\00.note.GNU-stack\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\004\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00!\00\00\00\00\00\00\00\00\00\00\00\00\004\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00'\00\00\00\00\00\00\00\00\00\00\00\00\004\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00,\00\00\00\00\00\000\00\00\00\00\00\00\004\00\00\00%\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\005\00\00\00\00\00\00\00\00\00\00\00\00\00\00Y\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00Y\00\00\00E\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00p\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00x\00\00 \00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\F1\FF\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00fffggg.c\00

MODIFICA: Codice completo:

 #include  #include  #include  #include  int main() { char nepCode[10]; char PathOut[1035]; char Msg[100] = {"#include \nint main();\n\nint main()\n{\n\n\treturn 0;\n}"}; FILE *fp; char path[1035]; char fullPath[1035]; /* Open the command for reading. */ fp = popen("/bin/pwd", "r"); if (fp == NULL) { printf("Failed to run command\n" ); exit(1); } /* Read the output a line at a time - output it. */ while (fgets(path, sizeof(path)-1, fp) != NULL) { int i = 0; printf("Current working directory: %s", path); for(i = 0; i < 1035; i++) { PathOut[i] = path[i]; } } printf("//Program by WolfyD\n//Creates a .c template file with your Neptun Code \n//in the folder from where it's run from"); printf("\n\n\nPlease enter your NEPTUN CODE: "); nepCode[0] = '/'; scanf("%s",nepCode); nepCode[6] = '.'; nepCode[7] = 'c'; int index = 0; int i2 = -1; for(index = 0; index < 1035; index++) { if(PathOut[index] != '\0') { fullPath[index] = PathOut[index]; } else { if(i2 == -1) { index--; fullPath[index] = '/'; } else { fullPath[index] = nepCode[i2]; } i2++; } } FILE *f = fopen(fullPath, "ab"); fputs(Msg,f); printf("File [ %s ] written to: %s\n\n",nepCode, fullPath); sleep(2); char sysStr[100] = {"gcc -oofile.o -c "}; int i = 0; for(i = 0; i < strlen(fullPath); i++) { sysStr[17 + i] = fullPath[i]; } printf("%s\n\n\n",sysStr); system(sysStr); printf("\nOutput file [ ofile.o ] created\n\n"); system("gcc -o output ofile.o"); /* close */ pclose(fp); return 0; } 

Per favore non giudicare troppo duramente, sto solo imparando c

MODIFICARE:

aggiornare:

Ho deciso di provare il codice sul mio PC Win8 e ho realizzato che almeno uno dei miei problemi era un po ‘di spazzatura, ma ora l’ho modificato leggermente. Su Windows ho MinGW e scrive un messaggio diverso quando provo a compilare il file o in un eseguibile:

 c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../libmingw32.a(main.o):main.c:(.tex t.startup+0xa7): undefined reference to `[email protected]' collect2.exe: error: ld returned 1 exit status 

Non sto seguendo completamente la tua logica, qui ci sono alcuni possibili problemi:

Prima di tutto, da dove prendi il percorso? questo programma può essere più semplice usando gli argomenti della riga di comando piuttosto che come lo si sta facendo.

Ciò significa che dichiari main come segue nel tuo file principale: int main (int argc, char * argv [])

In questo formato, argc è il numero di argomenti passati INCLUSO il nome del file e argv [0] è una stringa che contiene il nome del file.

Quindi, piuttosto che affidarsi al programma per generare il file per te, lo fai in un modo simile a questo:

 #include "stdlib.h" #include "stdio.h" #include "string.h" int main( int argc, char *argv[] ) { if (argc != 3) { fprintf( stderr, "Usage: %s %s\n", argv[0], "input_file output_file" ); fprintf( stderr, "Do not add an extension to output_file.\n" ); return EXIT_FAILURE; } unsigned int i = 0; for (i = 0; i < strlen( argv[2] ); i++) { if (argv[2][i] == '\n' || argv[2][i] == '\0') { argv[2][i] = '\0'; break; } } char format_string[150]; sprintf( format_string, "gcc.exe -Wall -Wextra -c %s -o %so", argv[1], argv[2] ); char format_string2[150]; sprintf( format_string2, "gcc.exe %s -o %s.exe", argv[1], argv[2] ); system( format_string ); system( format_string2 ); return EXIT_SUCCESS; } 

Con il programma di cui sopra, basta creare il file di input quindi passare il file inpu come primo argomento e l'output al secondo. Questo file fa due presupposti: input_file esiste e il percorso di gcc è nella variabile path del tuo ambiente.

Infine, non dimenticare che main non ha bisogno di un prototipo.