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

Visual C++ Discussion :

Visual Studio 64bits / CMake / jvm.dll / variable path


Sujet :

Visual C++

  1. #1
    Membre �clair�
    Avatar de Captain'Flam
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2011
    Messages
    273
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : F�vrier 2011
    Messages : 273
    Billets dans le blog
    1
    Par d�faut Visual Studio 64bits / CMake / jvm.dll / variable path
    Bonjour,

    un probl�me bien complexe m'am�ne vers vous... je vais essayer d'�tre clair :

    J'ai du code C bien propre et standard qui peut �tre compil� sous Windows (par Visual Studio 10) et sous Linux (par gcc).
    Les fichiers de projets (.sln et .vxproj pour Visual et makefile pour gcc) sont g�n�r�s avec CMake (il y a un beau CMakeLists.txt qui vient avec).
    Par ailleurs, depuis le code C, j'invoque du code java qui s'ex�cute via la JNI (et la jvm.dll qui va avec)
    Jusque l�, tout va bien...

    Nouvelle donne : on veut maintenant faire fonctionner tout �a en 64 bits.

    Sous Windows, gr�ce � CMake, il est facile de g�n�rer un projet "Visual Studio 10 Win64".
    Donc aucun probl�me pour compiler en 64 bits (apr�s quelques ajustements du code).

    Mais l'ex�cution commence directement par l'erreur 0xC000007B (pas tr�s limpide ).

    Une petite recherche sur les fora m'apprend que c'est simplement parce qu'il continue � charger la version 32 bits de jvm.dll.
    C'est � cause de ma variable path, qui contient un chemin vers elle.
    Je la change (ma variable path) et la faisant commencer par le chemin de la version 64 bits (que j'ai install�e) et tout fonctionne !

    Le probl�me c'est que je veux pouvoir passer de la version 32 bits � la version 64 bits sans avoir � �diter path � la main.
    La solution me semblait �tre d'ajouter un truc du genre "set path=c:\java64;%path%" dans le menu Propri�t�s/Ev�nement de build/Ev�nement post-build/Ligne de commande de Visual.
    Malheureusement, �a ne change que le path d'un process temporaire, et pas celui dans lequel va s'ex�cuter mon application...

    Et c'est l�, que vous, les experts, entrez en sc�ne !
    Y a-t-il un moyen de faire ce que je veux ?
    Attention, je ne parle pas de lancer mon application depuis un shell ou un script. Dans ce cas, je modifie mon path depuis le script avant de lancer l'appli.
    Je parle bien de lancer l'appli depuis l'environnement de Visual Studio pour pouvoir ex�cuter mon code en pas � pas.

    Merci de m'avoir lu jusque l� et d'avance pour vos r�ponses...

  2. #2
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503

  3. #3
    Membre �clair�
    Avatar de Captain'Flam
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2011
    Messages
    273
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : F�vrier 2011
    Messages : 273
    Billets dans le blog
    1
    Par d�faut
    Merci grandement !
    Mais ma joie fut de courte dur�e... la solution n'est pas l�...

    En effet, jvm.dll se trouve dans une arborescence de dossiers cr��s par l'installateur java.
    Elle m�me s'attend � trouver d'autres dll dans cette arborescence.

    Donc, m�me si je copie la dll 64 bits � c�t� de l'exe (ce que j'ai fait au d�but), il ira chercher ses d�pendances dans le dossier indiqu� dans $path qui contient la version 32 bits.
    Je ne peux pas non plus tout balancer dans le dossier syst�me...

    Conclusion, je n'ai pas le choix, le chemin de la dll 64 bits doit �tre dans le path !

  4. #4
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Dans ce cas, � moins de faire un Launcher qui change le path "� la main" programmatiquement, tu peux utiliser la solution suppos�e marcher sous Windows: Installer les deux versions de Java dans Program Files!

    La version 32 bits dans C:\Program Files (x86)\Java\blabla, la version 64 bits dans C:\Program Files\Java\blabla, et tu rajoutes C:\Program Files\Java\blabla dans le path une bonne fois pour toutes. La redirection automatique pour les processus 32 bits est cens�e faire le reste.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre �clair�
    Avatar de Captain'Flam
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2011
    Messages
    273
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : F�vrier 2011
    Messages : 273
    Billets dans le blog
    1
    Par d�faut
    Merci M�dinoc !

    En effet, j'avais � faire un launcher, mais il y avait trop de contraintes pour le reste du projet...
    (le mode 64bits est une "cerise sur le g�teau" : �a ne doit pas (trop) perturber le projet)

    La solution "Program Files" / "Program Files (x86)" est assez tentante (je n'y avais pas pens� du tout) mais pas tr�s portable dans le monde Linux...
    En plus, il n'y pas moyen de garantir que toutes les machines auront

    Sinon, je pensais � une autre solution : Y a-t-il un moyen d'emp�cher l'exe g�n�r� par Visual de charger les DLL au lancement ?

    S'il est possible de ne charger les DLL qu'� la premi�re utilisation (une sorte de mode "lazy"), j'aurais eu le temps de modifier le path...

  6. #6
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Tout-�-fait, il y a une option "delay-loaded DLLs" quelque part dans les options d'�dition de liens.
    Et en cas d'�chec, c'est une exception Win32 qui est lev�e lors de la tentative d'appel plut�t qu'une erreur irr�cup�rable qui emp�che le lancement du processus.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre �clair�
    Avatar de Captain'Flam
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2011
    Messages
    273
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : F�vrier 2011
    Messages : 273
    Billets dans le blog
    1
    Par d�faut
    �a marche !
    Cette solution me convient tout � fait...
    Dans une fonction dont l'impl�mentation peut �tre d�pendante de l'OS (via de beaux #ifdef), je commence par ajouter le chemin vers la version de jvm.dll qui va bien dans le path.
    Du coup, au moment du chargement effectif, il la trouve bien !
    Tout est ici et l�.

    Merci encore !

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    C'est une solution qu'il va falloir que je garde � l'esprit.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    Le delay-loading peut �tre une solution pour les API variable en fonction de l'OS, mais pour une m�canique 32/64 bits je trouve cela un peu alambiqu�.

    J'avais du qu'il y avait l�embarra du choix icic:
    https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

    Et en 2 lignes :
    Applications can control the location from which a DLL is loaded by specifying a full path or using another mechanism such as a manifest
    Bien plus simple que de tripatouiller cette antiquit� qu'est le PATH.

    Il y en a bien d'autres de plus adapt�s dans cette m�me page, je trouve.

  10. #10
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Il faut dire que si je me suis un peu int�ress� au SxS non-manag�, je n'ai jamais eu le temps d'aller assez loin pour le faire marcher.
    Il en est diff�remment du SxS manag�, o� je me suis justement servi du GAC pour r�soudre des probl�mes de 32/64 bits avec une biblioth�que en C++/CLI.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre �clair�
    Avatar de Captain'Flam
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    F�vrier 2011
    Messages
    273
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : F�vrier 2011
    Messages : 273
    Billets dans le blog
    1
    Par d�faut
    Merci bacelar, je suis bien all� voir la page que tu indiques.
    Mais dans mon cas, ce n'est pas applicable :


    Applications can control the location from which a DLL is loaded by specifying a full path or using another mechanism such as a manifest.
    If SafeDllSearchMode is enabled, the search order is as follows:
    1-The directory from which the application loaded.
    2. The system directory. Use the GetSystemDirectory function to get the path of this directory.
    3. The 16-bit system directory. There is no function that obtains the path of this directory, but it is searched.
    4. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
    5. The current directory.
    6. The directories that are listed in the PATH environment variable.


    Mon appli n'utilise pas de manifest, et je ne peux pas modifier le code � l'endroit o� la dll est charg�e (je ne peux pas changer la string qui contient le chemin vers la dll).
    Quant aux autres solutions :
    1 : Comme jvm.dll charge elle-m�me toute un collection d'autres dll, cela supposerait de copier toute l'arborescence des libraires java dans le r�pertoire de l'appli... possible, mais tr�s co�teux.
    2 : comme 1, mais avec en plus, des droits d'administrateur pour mon appli.
    3 : java n'est d�finitivement pas 16 bits.
    4 : comme 2.
    5 : comme 1.
    6 : c'est ma seule solution !
    Pour info, j'avais le m�me probl�me avec pthread.dll et libcurl.dll, et je l'ai r�solu avec la solution 1, car ces 2 dll sont autosuffisantes.

  12. #12
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 503
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 503
    Par d�faut
    Mon appli n'utilise pas de manifest,
    Pourquoi ne pas profiter de tous ses bienfaits ?

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. G�rer References sous Visual Studio avec CMake
    Par mestra dans le forum Syst�mes de compilation
    R�ponses: 0
    Dernier message: 21/01/2015, 14h44
  2. Visual studio 64bit/32bit
    Par Mozofeuk dans le forum Visual Studio
    R�ponses: 6
    Dernier message: 01/09/2010, 14h42
  3. Visual Studio Express 2005 - Forms + DLL?
    Par Jean_Benoit dans le forum Visual C++
    R�ponses: 2
    Dernier message: 22/10/2006, 23h31
  4. utilisation dll creer avec visual studio
    Par CaptainChoc dans le forum VC++ .NET
    R�ponses: 3
    Dernier message: 17/08/2006, 22h07
  5. R�ponses: 3
    Dernier message: 18/08/2005, 19h09

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