41 votes

Comment demander, par programme, à un compilateur de compiler un fichier en C ++?

Voici mon programme en 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;
}

Lorsque le programme est exécuté, il crée un fichier texte nommé "firstFile.cpp" contenant le code suivant:

firstFile.cpp

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

qui, lorsqu'il est exécuté, affiche "hello world" sur l'écran.

Donc, je voudrais ajouter à la main.cpp fichier de lignes de code à demander à GCC pour compiler la nouvelle firstFile.cpp venez de créer.

Je suis de l'utilisation de GNU gcc sur les deux plate-forme Ubuntu et Windows.

Edit: Est-il possible d'obtenir tout code d'erreur du formulaire de l'appel au compilateur? Si, pourquoi pas.

61voto

Galik Points 522

Ce n'est pas trop difficile en utilisant la commande std :: system . Les chaînes de caractères brutes nous permettent également d’insérer du texte multiligne, ce qui est utile pour taper des parties de programme:

 #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
}
 

Sortie:

 Hello World!
 

14voto

David van rijn Points 1208

gcc est un exécutable, donc vous devez utiliser system("gcc myfile.cpp") ou popen("gcc myfile.cpp"), ce qui vous donne un filestream comme résultat.

Mais puisque vous êtes de la génération de code, de toute façon, vous n'avez même pas besoin de l'écrire dans un fichier. Vous pouvez ouvrir la gcc proces avec FILE* f = popen("gcc -x ++ <whatever flags>"). Ensuite, vous avez, vous pouvez écrire votre coe avec fwrite(f, "<c++ code>"). Je sais que c'est c et pas vraiment d' c++ mais il pourrait être utile. ( Je ne pense pas qu'il y est un c++ version popen()).

13voto

Artur Nowicki Points 139

Tout ce que vous avez à faire est d’ajouter la ligne suivante après avoir créé votre fichier.

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

Fonctionne sous OS X, donc j'espère que cela fonctionnera pour vous aussi.

7voto

secretgenes Points 380

Pour utiliser la ligne de commande d'un compilateur dans un fichier source, utilisez la fonction système.

La syntaxe est la suivante:

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

Dans votre cas, ça devrait être comme

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

PS: la fonction système ne renvoie pas d'exceptions.

Programme

 #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;
}
 

6voto

Daniel Jour Points 6551

Selon ce que vous voulez vraiment atteindre vous pourriez aussi envisager l'incorporation de certains compilateur C++ dans votre application.

Notez que c'est de loin pas aussi simple que d'appeler un exécutable externe, et peut-être l'objet des restrictions de licence (GPL).

Notez également qu'en utilisant std::system ou un mécanisme similaire vous ajouter l'exigence sur votre environnement cible pour effectivement avoir appelé compilateur disponible (sauf si vous en quelque sorte le bundle avec votre demande).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X