2008-09-20 3 views
33

Sous Linux/GCC, je peux utiliser l'option -rpath pour modifier un chemin de recherche d'exécutable pour les bibliothèques partagées sans tempérer avec les variables d'environnement.Existe-t-il un équivalent Windows/MSVC à l'indicateur de lien -rpath?

Est-ce que cela peut également être accompli sur Windows? Pour autant que je sache, les DLL sont toujours recherchées dans le répertoire de l'exécutable et dans PATH.

Mon scénario: Je voudrais mettre des bibliothèques partagées dans des emplacements en fonction de leurs propriétés (32/64bit/Debug/Release) sans prendre en compte les noms uniques. Sous Linux, cela se fait facilement via rpath, mais je n'ai encore trouvé aucun moyen de le faire sous Windows.

Merci pour tous les conseils!

Répondre

4

L'ordre de recherche des DLL dans Windows est décrit sur this page sur MSDN. Si vous utilisez run-time dynamic linking, vous pouvez spécifier le dossier lorsque vous appelez LoadLibrary.

3

"Isolated applications" est un mécanisme permettant d'incorporer un manifeste XML qui décrit les dépendances DLL.

+0

Ce mécanisme est uniquement destiné aux assemblages. Cela appartient au code managé. – Christian

+0

Avez-vous une référence pour cela? Tout ce que j'ai vu autour de cette rubrique semble autoriser les DLL de code natif tout de même. –

+0

L'assemblage est défini sur [Wikipedia] (https://en.wikipedia.org/wiki/.NET_assembly). MSDN semble utiliser le terme Assembly uniquement en conjonction avec le MSI [Assemblies] (http://msdn.microsoft.com/en-us/library/aa367757%28v=vs.85%29.aspx). Votre article référencé appartient donc à une application installée. Les informations rpath sont intégrées dans l'application et ne sont pas relayées sur une installation. Rpath est efficace juste après la liaison. – Christian

16

Malheureusement, il n'y a pas d'analogue direct à RPATH. Il y a un certain nombre de possibilités alternatives, chacune d'entre elles étant probablement indésirable à votre propre manière. Etant donné que vous avez besoin d'un exe différent pour chaque version de construction, afin d'éviter les conflits de bibliothèque d'exécution, comme vous pouvez le deviner, le plus simple est de placer chaque exe dans le même dossier que chaque ensemble de DLL.

Comme vous l'avez également mentionné, la méthode la plus universelle consiste à modifier la variable PATH en utilisant un fichier batch pour amorcer l'exe.

Vous pouvez à la place modifier le répertoire de travail en cours avant d'exécuter le programme dans le dossier DLL souhaité.

Vous pouvez utiliser la fonction SetDllDirectory ou AddDllDirectory à l'intérieur de votre exe. Ceci est probablement le plus proche d'un RPATH, mais ne fonctionne que sur WinXP SP1 ou plus tard.

Si vous souhaitez modifier le nom de fichier de chaque saveur exe, vous pouvez utiliser la clé de registre "App Paths". Chaque exe aurait besoin d'un nom de fichier unique.

Questions connexes