ejecutar - programa para compilar c++
¿Cómo preguntar, programáticamente, un compilador para compilar un archivo en C++? (6)
Algo como esto:
#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;
}
o el comando que sea apropiado para el compilador que está utilizando.
El siguiente es mi programa C ++:
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;
}
Cuando se ejecuta el programa anterior, crea un archivo de texto llamado "firstFile.cpp" que contiene el siguiente código:
firstFile.cpp
#include <iostream>
int main() {
std::cout << "hello world" << std::endl;
return 0;
}
que, cuando se ejecuta, imprime "hello world" en la pantalla.
Por lo tanto, me gustaría agregar a las líneas de código del archivo main.cpp pidiendo a GCC que compile el nuevo firstFile.cpp recién creado.
Estoy usando GNU gcc tanto en la plataforma Ubuntu como en Windows.
¿Es posible obtener un código de error de la llamada al compilador? Si no, por qué.
Dependiendo de lo que realmente desee lograr, también podría considerar embedding algún compilador de C ++ en su aplicación.
Tenga en cuenta que esto no es tan fácil como llamar a un ejecutable externo, y podría estar sujeto a restricciones de licencia (GPL).
También tenga en cuenta que al usar std::system
o un mecanismo similar agrega el requisito en su entorno objetivo para que realmente tenga el compilador llamado disponible (a menos que de alguna manera lo agrupe con su aplicación).
Esto no es muy difícil usando el comando system . También los literales de cadena sin procesar nos permiten insertar texto de línea múltiple que es útil para escribir partes de un programa:
#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
}
Salida:
Hello World!
Todo lo que necesita hacer es agregar la siguiente línea después de crear su archivo.
system("g++ firstFile.cpp -o hello");
Funciona en OS X, así que espero que funcione para usted también.
gcc
es un ejecutable, por lo que debe usar cualquier system("gcc myfile.cpp")
o popen("gcc myfile.cpp")
, lo que le da una salida de archivos como resultado.
Pero ya que está generando código de todos modos, ni siquiera necesita escribirlo en un archivo. Puede abrir el proceso gcc con FILE* f = popen("gcc -x ++ <whatever flags>")
. Luego tienes que puedes escribir tu código con fwrite(f, "<c++ code>")
. Sé que esto es c
y no realmente c++
pero podría ser útil. (No creo que haya una versión en c++
de popen()
).
Para utilizar la línea de comandos de un compilador en el archivo fuente, use la función del sistema.
La sintaxis de la cual es:
int system (const char* command); //built in function of g++ compiler.
En tu caso, debería ser como
system("g++ firstFile.cpp");
PD: la función del sistema no arroja Excepciones.
Programa
#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;
}