IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Compiler "à la volée"


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut Compiler "à la volée"
    Bonjour à tous.
    J'aimerai faire en C++ (non managé) une chose que je fais en C# :
    Je génère du code (une classe par exemple), puis j'utilise un objet qui permet d'invoquer le compilateur C#, ca me fait une DLL que je charge aussitot dans le process, un petit coup de reflexion et hop la nouvelle classe s'intègre à l'application.

    Seulement voila, je ne me voit pas trop distribuer tout un compilo avec mon programme. Donc j'ai cherché un compilateur "intégrable" mais je n'ai rien trouvé...

    Résultat je me dis que je ne vais pas avoir le choix, je dois distribuer un compilo avec ou du moins permettre a l'utilisateur de spécifié le compilo installé sur sa machine.
    Seulement voila, j'ai ouïe dire qu'il n'est pas bon de mixer les compilos (en gros il faudrait que la compilation a la volée utilise le même compilo que celui qui a servit à compiler l'application).

    Dans quelle mesure c'est impactant ?

    Sinon j'ai fais un premier jet avec le compilo de Visual Studio 2010 Ultimate, mais ca gauffre violemment dans la fonction CreateProcess. Il me dit qu'il y a une exception non gérée, violation d'accès lors de l'écriture, et le débogueur m'amène dans le fichier dbgheap.c, ligne 239. Je capte pas comment ca se fait.

    Le code utilisé est le suivant :
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    #include <iostream>
    #include <fstream>
     
    #include <windows.h>
     
    int main(int argc, wchar_t* argv[])
    {
    	// Création d'un fichier source
    	std::ofstream file("test.cpp", std::ios::out);
    	if(!file)
    	{
    		std::cerr << "Impossible d'ouvrir le fichier test.cpp" << std::endl;
    		return -1;
    	}
    	file << "#include <iostream>" << std::endl;
    	file << "void hello() { std::cout << \"hello !\" << std::endl; }" << std::endl;
    	file.close();
     
    	STARTUPINFO         siStartupInfo;
    	PROCESS_INFORMATION piProcessInfo;
     
    	memset(&siStartupInfo, 0, sizeof(siStartupInfo));
    	memset(&piProcessInfo, 0, sizeof(piProcessInfo));
     
    	siStartupInfo.cb = sizeof(siStartupInfo);
    	wchar_t* env[2];
    	env[0] = L"PATH=%PATH%;D:\\softs\\Microsoft Visual Studio 2010\\Common7\\IDE";
    	env[1] = 0;
     
    	int result = CreateProcess(0,
    		L"D:\\softs\\Microsoft\\ Visual\\ Studio\\ 2010\\VC\\bin\\cl.exe /EHsc test.cpp",
    		0,
    		0,
    		FALSE,
    		CREATE_DEFAULT_ERROR_MODE,
    		0,
    		L"D:\\programmation\\projects\\dynamic_compil\\dynamic_compil",
    		&siStartupInfo,
    		&piProcessInfo);
     
    	if(!result)
    	{
    		std::cerr << GetLastError() << std::endl;
    	}
    	return 0;
    }

    Merci de votre aide

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Hello

    On fait ça dans ma boîte, générer du code qui est ensuite compilé à la volée.

    Citation Envoyé par ctxnop Voir le message
    je dois distribuer un compilo avec ou du moins permettre a l'utilisateur de spécifié le compilo installé sur sa machine.
    Seulement voila, j'ai ouïe dire qu'il n'est pas bon de mixer les compilos (en gros il faudrait que la compilation a la volée utilise le même compilo que celui qui a servit à compiler l'application).
    A cause de ce problème notamment, on ne charge pas dynamiquement la DLL créée, on compile un exécutable qui sera lancé à part et dont on va lire la sortie.

  3. #3
    screetch
    Invité(e)
    Par défaut
    pour ton crash:
    An environment block can contain either Unicode or ANSI characters. If the environment block pointed to by lpEnvironment contains Unicode characters, be sure that dwCreationFlags includes CREATE_UNICODE_ENVIRONMENT. If this parameter is NULL and the environment block of the parent process contains Unicode characters, you must also ensure that dwCreationFlags includes CREATE_UNICODE_ENVIRONMENT.
    deja ca c'est pas bon
    de plus, un environnement ressemble a ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "env1=value1\0env2=value2\0env3=value3\0\0"
    (unicode ou ansi)

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Désolé, je n'ai pas du tout eu le temps hier de continuer sur ce sujet.

    Effectivement, j'ai complètement zapé le flag CREATE_UNICODE_ENVIRONMENT, même pas fait gaffe.
    Ce n'était pas la seule erreur, je créais la variable d'environnement mais je ne la passait pas à la fonction, il faut passer je ne passais pas non plus le chemin de l'exécutable à lancer, pensant que la commande était suffisante...

    Enfin bref, ca fonctionne maintenant, je n'ai plus qu'a affiner tout ca et faire de testes de compatibilité entre les compilos.

    Merci du coup de main

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 5
    Par défaut
    Bonjour,

    J'essaye de compiler une DLL C++ lors de l'execution de mon programme, mais j'ai quelque problème. Peut tu mettre les différentes erreurs que tu avais faite dans le forum et m'expliquer a quoi il servent.

    Merci d'avance.

  6. #6
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Les erreurs que j'avais faites et leurs explications/résolutions sont toutes sur ce post.
    Je ne suis pas aller beaucoup plus loin sur le sujet, le problème imposant d'utiliser le même compilateur pour l'application "principale" et la partie compilée a la volée est trop contraignante par rapport a ses avantages.
    A la base je voulais faire ca pour utiliser le C++ en tant que langage de "script", mais au final il est bien plus simple d'utiliser vraiment un truc fait pour ca, genre le lua, le python ou même un binding CLR pour scripter en .Net.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo