2014-09-23 1 views
-1

Я хочу, чтобы моя программа, чтобы сделать то же самое, как терминал команды ниже:Как написать программу на языке C, которая компилирует другие C-программы с помощью GCC?

gcc program1.c -o p1 funcs.c 

gcc program2.c -o p1 funcs.c 

Это то, что я экспериментировал с: Making a C program to compile another

я получил, как далеко, так называя мою программу (./"programName") в терминале, что он заменил необходимость для меня тоже типа gcc, но мне нужно тоже ввести остальные.

+0

слишком широкий .. и требует много усилий. – Steve

+5

_ "Это то, что я экспериментировал с" _. И на какие проблемы вы столкнулись? Неясно, каков ваш реальный вопрос. – Michael

ответ

0

Вы можете использовать exec семейной функции или вы можете непосредственно выполнить команду оболочки с помощью метода system()

2

Вы можете использовать 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); 
    } 
} 

BTW, ваша программа может сгенерировать код на Си, то fork + execvewaitpid + в gcc компилятор (или make), то, возможно, даже dlopen(3) результат компиляции (вам потребуется gcc -fPIC -shared -O foo.c -o foo.so компилировать a dlopen способный общий объект ...). MELT делает точно это. (а также мой manydl.c, который показывает, что вы можете сделать большой кусок dlopen -s ...)

Смежные вопросы