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++

  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.

  7. #7
    Membre extr�mement actif
    Homme Profil pro
    Graphic Programmer
    Inscrit en
    Mars 2006
    Messages
    1 633
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Graphic Programmer
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 633
    Par d�faut
    sinon tu peux �crire un interpr�teur.

    T'a peu �tre pas besoin de toute les specif du c++

    au pire ya des interpr�teur c++. va sur ce lien ils en parlent : http://www.velocityreviews.com/forum...gine-in-c.html

  8. #8
    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
    Citation Envoy� par cuicui78 Voir le message
    sinon tu peux �crire un interpr�teur.

    T'a peu �tre pas besoin de toute les specif du c++
    Oula, la flemme d'�crire un tel truc alors qu'il existe tout plein de choses pour le faire.
    En plus je sais bien que si j'�cris un interpr�teur "avec juste ce que j'ai besoin", je sais pertinemment que je vais sans cesse atteindre les limites de ce que j'avais d�finit au d�but et devoir tout recommencer.
    Donc je pr�f�re un truc supportant un vrai langage complet.

    Citation Envoy� par cuicui78 Voir le message
    au pire ya des interpr�teur c++. va sur ce lien ils en parlent : http://www.velocityreviews.com/forum...gine-in-c.html
    Ouais, c'est une id�e, je ne savais pas qu'il existait des interpr�teurs c++, je jetterai un oeil a l'occasion, pour l'instant le projet est en stand by, je n'ai plus du tout de temps � y consacrer. Merci pour le lien en tout cas, fort int�ressant

  9. #9
    Membre chevronn� Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par d�faut
    Code : 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
    #include <string>
    #include <iostream>
    #include <fstream> 
    #include <windows.h>
     
    using namespace std ;
     
    typedef int (*MYPROC)(int); 
     
    int main(int argc, char** argv)
    {
    	string dllstr("__declspec( dllexport ) int MyFuncInc(int a) { return ++a; }" );
    	ofstream out("dll.c");
    	out << dllstr << endl ;
    	out.close();
    	system( "cl.exe -o dll.dll /EHsc dll.c /link /DLL /OUT:dll.dll" );
    	MYPROC MyFuncInc = (MYPROC)GetProcAddress( LoadLibrary("dll.dll"), "MyFuncInc" );
    	cout << MyFuncInc(41) << endl ;
    	return 0;
    }
    Perso c'est juste pour le fun car je vois pas vraiment l'int�r� de faire de genre de chose, soit tu fait du scripting soit du distribue des DLL.

  10. #10
    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
    Citation Envoy� par themadmax Voir le message
    Perso c'est juste pour le fun car je vois pas vraiment l'int�r� de faire de genre de chose, soit tu fait du scripting soit du distribue des DLL.
    Ca a �norm�ment d'int�r�t quand tu dois faire de lourds calculs num�riques sur un mod�le th�orique. Tu transforme ton mod�le en code C (ou C++), que tu compiles � la vol�e et que tu ex�cutes pour r�cup�rer le r�sultat.

    Evidemment, on est oblig� de lancer l'ex�cution dans un processus externe, ce qui oblige � mettre en place un syst�me de communication. Ce serait plus simple � mettre en place si le code compil� pouvait �tre charg� � la vol�e.

  11. #11
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    Par d�faut
    Ouais faut que le code soit bien lourd pour que �a soit rentable.
    Pour des calculs l�gers � "moyen", embarquer Python serait � mon avis plus appropri� quand on a besoin d�ex�cuter du code � la vol�e...

  12. #12
    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
    Citation Envoy� par poukill Voir le message
    Ouais faut que le code soit bien lourd pour que �a soit rentable.
    Oui, c'est le cas quand tu r�sout de gros syst�mes d'�quations diff�rentielles par exemple.

  13. #13
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Citation Envoy� par jblecanard Voir le message
    syst�mes d'�quations diff�rentielles
    Les r�gles du forum interdisent les vulgarit�s
    (vieux souvenir d'�tudiant : EDP == )

  14. #14
    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
    Citation Envoy� par 3DArchi Voir le message
    Les r�gles du forum interdisent les vulgarit�s
    (vieux souvenir d'�tudiant : EDP == )
    Moi non plus j'ai jamais trop aim� �a . Ce n'est pas moi qui me suit farci le code.

  15. #15
    Membre chevronn� Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par d�faut
    Citation Envoy� par jblecanard Voir le message
    Ca a �norm�ment d'int�r�t quand tu dois faire de lourds calculs num�riques sur un mod�le th�orique. Tu transforme ton mod�le en code C (ou C++), que tu compiles � la vol�e et que tu ex�cutes pour r�cup�rer le r�sultat.
    Tu as fait un logiciel en C++, tu le distribut. Ton client doit lui m�me �crire des "pluging" en C++, cela reviens de fournir un SDK?

    Citation Envoy� par jblecanard Voir le message
    Evidemment, on est oblig� de lancer l'ex�cution dans un processus externe, ce qui oblige � mettre en place un syst�me de communication. Ce serait plus simple � mettre en place si le code compil� pouvait �tre charg� � la vol�e.
    Regarde mon code il compile une DLL, puis la charge et l�ex�cute.

  16. #16
    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
    Tu n'as pas compris.

    Il s'agit de code g�n�r� dynamiquement par l'utilisateur, pendant l'utilisation du logiciel, et ce de mani�re transparente. Il cr�e un mod�le, et pour le r�soudre, le logiciel g�n�re du code. Il pourrait g�n�rer du python au autre, bien s�r, mais le but est un max de perfos donc on g�n�re du C. Ca cr�e des tas de fichiers C illisibles pour un esprit cens� mais qui compil�s et ex�cut�s produisent un r�sultat exploitable.

    Citation Envoy� par themadmax Voir le message
    Regarde mon code il compile une DLL, puis la charge et l�ex�cute.
    Oui mais on retombe sur le probl�me de compatibilit� entre compilateurs. Ta solution impose au client d'utiliser le m�me compilateur que celui que tu as utilis� pour lui livrer ton soft.

  17. #17
    Membre chevronn� Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Par d�faut
    Citation Envoy� par jblecanard Voir le message
    Oui mais on retombe sur le probl�me de compatibilit� entre compilateurs. Ta solution impose au client d'utiliser le m�me compilateur que celui que tu as utilis� pour lui livrer ton soft.
    Une DLL est un format d��change de format ex�cutable, si tu respect les convention d'appel il est normalement ind�pendant du compilateur. Par exemple le moindre programme que tu compile est li�e avec les DLL windows, pourtant tu peux les utilis�es avec GCC, TCC...

  18. #18
    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
    C'est vrai en C, beaucoup moins pour du C++.
    Si dans ton programme principale tu d�clare une classe A, et que tu g�n�re a la vol�e une classe B h�ritant de A, il n'y a pas qu'une question de convention d'appel.
    Les compilateurs sont plus ou moins "libre" de la fa�on dont ils traduisent ca en code machine. Par exemple, j'avais lu je ne sais plus o� que certains compilateurs placent la vtable en d�but d'objet et d'autres en fin. Ce qui fait que l'objet B ne peut �tre utilis� dans le code principal car il a un format diff�rent.
    Si je me goure et qu'il est effectivement possible de compiler et ex�cuter un code a la vol� sans se soucier du compilateur, ca m'int�resse grandement, ne serait-ce que pour le plaisir de le mettre en place.

  19. #19
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Avec une API C, ok. Avec du C++, c'est plus d�licat : l'ABI (interface binaire) d�pend du compilateur.
    Ainsi entre GCC et Visual par exemple, la d�coration de nom (name mangling) n'est pas la m�me.
    Plus d�licat, en cas d'h�ritage virtuel, une des deux impl�mentations utilise le m�me vpointeur pour la vtable et l'offset. L'autre impl�mentation utilise un vpointeur pour la vtable et un second vpointeur pour l'offset.
    Un pointeur de fonction virtuelle est aussi diff�rent (cf ici)
    Sans compter les impl�mentations diff�rentes de la STL et autres joyeuset�s

    [edit] grilled

+ 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