Как спросить, программно, компилятор для компиляции файла на С++?
Ниже приведена моя программа на С++:
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.
Можно ли получить какой-либо код ошибки из вызова компилятора? Если нет, то почему.
Ответы
Ответ 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;
}
или любая команда, подходящая для используемого компилятора.