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 :

Dll dans un répertoire différent de l'exe


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juillet 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 289
    Points : 635
    Points
    635
    Par défaut Dll dans un répertoire différent de l'exe
    Bonsoir à tous,

    Développant en C++, je poste cette question ici mais peut être a-t-elle sa place ailleurs ...
    Tout est-il qu'à l'heure actuelle mes dlls sont forcément dans le même répertoire que l'éxécutable, sous peine de voir une erreur "Dll [...] manquante".

    Y'a-t-il un moyen pour séparer les répertoires ? l'idéal étant un répertoire "Mes Dlls" et un autre "Librairies externes utilisées" ...

    Merci d'avance
    JS

  2. #2
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Bonsoir,

    Si tu travailles sous GNU/Linux ou Mac, il y a le rpath qui permet de spécifier un chemin relatif à l'exe.

    Sous Windows par contre, il n'y a guère d'autre moyen que de copier la DLL dans le dossier de l'exe ou bien de modifier le PATH.
    Cours : Initiation à CMake
    Projet : Scalpel, bibliothèque d'analyse de code source C++ (développement en cours)
    Ce message a été tapé avec un clavier en disposition bépo.

  3. #3
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Bonsoir
    Citation Envoyé par Florian Goo Voir le message
    Sous Windows par contre, il n'y a guère d'autre moyen que de copier la DLL dans le dossier de l'exe ou bien de modifier le PATH.
    Si il y a un moyen d'utiliser des DLL sans qu'il soient dans le même répertoire
    mais il faut qu'elle soient des DLL COM
    If you type Google into Google, you Can break the internet" - The IT Crowd

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Oui c'est possible mais c'est un peu pénible à mettre en place, plus d'information dans Isolated Applications and Side-by-side Assemblies.

    MAT.

  5. #5
    Membre éclairé
    Avatar de buggen25
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    554
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Août 2008
    Messages : 554
    Points : 709
    Points
    709
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Salut,

    Oui c'est possible mais c'est un peu pénible à mettre en place
    MAT.
    Pas plus qu'une DLL normale. de plus une DLL com possède un identificateur unique ( GUID ) ce qui n'est pas le cas dans une DLL classique
    If you type Google into Google, you Can break the internet" - The IT Crowd

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par buggen25 Voir le message
    Pas plus qu'une DLL normale. de plus une DLL com possède un identificateur unique ( GUID ) ce qui n'est pas le cas dans une DLL classique
    Excuse-moi, je répondais directement à la question d'origine en fait.

    MAT.

  7. #7
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Si on la met dans le dossier windows/system32, il n'y a pas de problèmes non?

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ben si, il y a un problème: Tu as une DLL non-système dans system32.

    C'est beaucoup plus sale que de modifier le path, et l'auteur aimerait bien ne pas avoir à la modifier...
    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
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Si on la met dans le dossier windows/system32, il n'y a pas de problèmes non?
    Il faut arrêter avec ces bidouilles!
    On ne devrait même pas pouvoir modifier ce répertoire, voire même tout le dossier Windows (oui, bon, dans certains cas on a pas le choix).
    Qu'a-t-il de plus que n'importe quel autre dossier? Il est dans le PATH par défaut. Est-ce que ça nous donne pour autant le droit de le polluer?
    Est-ce que tu vas mettre dans les dossier de Firefox des éléments de VLC par exemple?

    Il n'y a que deux solutions qui ont déjà été évoquées ici:
    • Mettre les DLLs dans le dossier de l'exécutable
    • Modifier le PATH et y rajouter le répertoire de la DLL
    Si je ne dis pas de bêtise, un EXE va d'abord chercher dans son répertoire, puis dans les dossiers du PATH.

    A mon sens il n'y a pas de plus ou moins bonne solution entre ces deux-là, ça dépend du contexte. Par exemple, si la DLL est seulement utilisé par le programme, il faut bien sûr la mettre avec l'EXE. Par contre, si elle est utilisée par plusieurs programmes qui n'ont rien à voir, mieux vaut la mettre dans un dossier "Commun" par exemple, et rajouter celui-ci au PATH.

    Désolé, je m'enflamme un peu .
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par Spout Voir le message
    un EXE va d'abord chercher dans son répertoire, puis dans les dossiers du PATH.
    C'est un peu plus subtil que ça, cf. Assembly Searching Sequence (Au passage on remarque que le PATH n'est pas listé).

    Citation Envoyé par Spout Voir le message
    Il n'y a que deux solutions qui ont déjà été évoquées ici:
    • Mettre les DLLs dans le dossier de l'exécutable
    • Modifier le PATH et y rajouter le répertoire de la DLL
    Il y en a d'autres dont notamment : utiliser le système préconisé pour les placer dans le répertoire centralisé WinSxS (shared assemblies), écrire un manifest placé avec l'application pour indiquer où trouver les DLL (private assemblies), etc..
    Mais oui, la solution la plus simple reste encore de placer les DLL avec l'application (ou démarrer l'application depuis le répertoire des DLL, plus malin que de bricoler le PATH).

    MAT.

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Attention, il y a une différence entre la recherche d'assembly et la recherche de DLL. Différence d'autant plus confuse quand les "unmanaged assemblies" s'ajoutent au mélange...
    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.

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    C'est pas juste pour les LoadLibrary ça ?

    MAT.

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En fait, il me semble que c'est à la fois pour les LoadLibrary() et pour le chargement au lancement de toutes les bibliothèques n'étant pas des Unmanaged Assemblies (en gros, toute bibliothèque faite ou utilisée avec autre chose que "Visual 2005 ou supérieur").
    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.

  14. #14
    Membre confirmé

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Points : 527
    Points
    527
    Par défaut
    Je ne comprends pas bien... Vous êtes l'auteur du programme principal? Dans ce cas, il suffit d'utiliser LoadLibrary. Si vous êtes l'auteur de la librairie et que vous voulez que vos utilisateurs puissent l'utiliser de n'importe où tout en l'installant dans votre propre dossier d'installation, il suffit de leur dire d'utiliser LoadLibrary, en leur filant un source d'exemple si vraiment besoin.
    Si vous ne voulez absolument pas utiliser LoadLibrary (j'ai du mal à imaginer pourquoi, ça n'a que des avantages, en particulier la bonne coopération inter-langage et inter-compilateur), alors oui il faut sans doute sauter à la corde 3 fois autour du grand chêne une nuit de pleine lune, voire maitriser les assemblies side-by-side et autre patois MS sale.
    "Maybe C++0x will inspire people to write tutorials emphasizing simple use, rather than just papers showing off cleverness." - Bjarne Stroustrup
    "Modern C++11 is not your daddy’s C++" - Herb Sutter

  15. #15
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Quel est l'intérêt de passer par LoadLibrary lorsque ce n'est pas nécessaire (pour faire un système de plugins par ex) ?
    Tu lies absolument tout en statique peut-être ?

    MAT.

  16. #16
    Membre confirmé
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juillet 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 289
    Points : 635
    Points
    635
    Par défaut
    Bonjour à tous,

    Tout d'abord merci de m'avoir autant répondu.
    Initialement cette question m'est venue car j'utilise des librairies extérieures (SDL, SFML ...) et je trouvais un peu dégueu d'avoir toutes les Dlls dans le même répertoire que mes Dlls maisons et mon Exe principal (question lisibilité).

    A terme je ne suis pas sur que mon programme aille sur d'autres postes que le mien donc la modification du PATH pour y inclure les chemins vers les Dlls requisent me parait pas trop mal.

    Pour info je lie statiquement les lib externes à mes projets, et mes Dlls "internes" sont utilisées via LoadLibrary.

    Merci à tous pour vos réponses

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/07/2007, 14h24
  2. Réponses: 1
    Dernier message: 12/04/2007, 11h50
  3. [Vb.Net] Dll dans un répertoire différent
    Par Kiboumz dans le forum VB.NET
    Réponses: 1
    Dernier message: 15/03/2007, 13h34
  4. Lien DLL dans un répertoire spécifique
    Par dimdidi dans le forum Langage
    Réponses: 7
    Dernier message: 20/02/2006, 08h06
  5. [VBA] Excel- Save un document dans 2 répertoires différents
    Par altarez dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/01/2006, 22h32

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