Подтвердить что ты не робот

Как спросить, программно, компилятор для компиляции файла на С++?

Ниже приведена моя программа на С++:

main.cpp

#include <iostream>
#include <fstream>

using namespace std;

int main() {

    ofstream fileWriter;
    fileWriter.open ("firstFile.cpp");
    fileWriter << "#include <iostream>" << endl;
    fileWriter << "int main() {" << endl;
    fileWriter << "\tstd::cout << \"hello world\" << std::endl;" << endl;
    fileWriter << "\treturn 0;" << endl;
    fileWriter << "}" << endl;
    fileWriter.close();

    return 0;
}

Когда вышеуказанная программа выполнена, она создает текстовый файл с именем "firstFile.cpp", содержащий следующий код:

<я > firstFile.cpp

#include <iostream>
int main() {
    std::cout << "hello world" << std::endl;
    return 0;
}

который при выполнении печатает "привет мир" на экране.

Итак, я хотел бы добавить в строки строки main.cpp код, запрашивая GCC для компиляции только что созданного нового firstFile.cpp.

Я использую GNU gcc на обеих платформах Ubuntu и Windows.

Можно ли получить какой-либо код ошибки из вызова компилятора? Если нет, то почему.

4b9b3361

Ответ 1

Это не сложно с помощью команды std:: system. Кроме того, raw string литералы позволяют вставлять многострочный текст, который полезен для ввода в части программы:

#include <cstdlib>
#include <fstream>

// Use raw string literal for easy coding
auto prog = R"~(

#include <iostream>

int main()
{
    std::cout << "Hello World!" << '\n';
}

)~"; // raw string literal stops here

int main()
{
    // save program to disk
    std::ofstream("prog.cpp") << prog;

    std::system("g++ -o prog prog.cpp"); // compile
    std::system("./prog"); // run
}

Вывод:

Hello World!

Ответ 2

Все, что вам нужно сделать, это добавить следующую строку после создания файла.

system("g++ firstFile.cpp -o hello");

Работает на OS X, поэтому я надеюсь, что это сработает и для вас.

Ответ 3

gcc - это исполняемый файл, поэтому вам нужно использовать либо system("gcc myfile.cpp"), либо popen("gcc myfile.cpp"), что дает вам результат потока.

Но поскольку вы все равно генерируете код, вам даже не нужно записывать его в файл. Вы можете открыть gcc-процессы с помощью FILE* f = popen("gcc -x ++ <whatever flags>"). Тогда вы можете написать свой коэффициент с помощью fwrite(f, "<c++ code>"). Я знаю, что это c и не действительно c++, но это может быть полезно. (Я не думаю, что существует c++ версия popen()).

Ответ 4

Чтобы использовать командную строку компилятора в исходном файле, используйте системную функцию.

Синтаксис:

int system (const char* command); //built in function of g++ compiler.

В вашем случае это должно быть как

system("g++ firstFile.cpp");

PS: системная функция не выбрасывает исключения.

Программа

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

int main() {

    ofstream fileWriter;
    fileWriter.open ("firstFile.cpp");
    fileWriter << "#include <iostream>" << endl;
    fileWriter << "int main() {" << endl;
    fileWriter << "\tstd::cout << \"hello world\" << std::endl;" << endl;
    fileWriter << "\treturn 0;" << endl;
    fileWriter << "}" << endl;
    fileWriter.close();

    system("g++ firstFile.cpp");

    return 0;
}

Ответ 5

В зависимости от того, что вы на самом деле хотите достичь, вы также можете рассмотреть вложение в компилятор С++.

Обратите внимание, что это далеко не так просто, как вызов внешнего исполняемого файла, и может быть подвержен ограничениям лицензии (GPL).

Также обратите внимание, что с помощью std::system или аналогичного механизма вы добавляете требование в свою целевую среду, чтобы на самом деле иметь доступный вызываемый компилятор (если вы каким-то образом не связали его с вашим приложением).

Ответ 6

Что-то вроде этого:

#include <iostream>
#include <fstream>

using namespace std;

int main() {

    ofstream fileWriter;
    fileWriter.open ("firstFile.cpp");
    fileWriter << "#include <iostream>" << endl;
    fileWriter << "int main() {" << endl;
    fileWriter << "\tstd::cout << \"hello world\" << std::endl;" << endl;
    fileWriter << "\treturn 0;" << endl;
    fileWriter << "}" << endl;
    fileWriter.close();

    system("c firstFile.cpp");

    return 0;
}

или любая команда, подходящая для используемого компилятора.