GNU/Linux >> Tutoriels Linux >  >> Linux

Cmake sous Windows n'ajoute pas de chemins de bibliothèque partagés (fonctionne sous Linux)

Windows n'a tout simplement pas certains des concepts nécessaires pour permettre à CMake de configurer votre environnement de construction. Lors de la liaison, Windows recherchera dans le même répertoire que le binaire, puis recherchera les répertoires dans votre PATH. Il n'y a rien comme RPATH, qui est utilisé sur la plupart des plates-formes Unix, pour injecter d'autres chemins plus appropriés. Les DLL doivent généralement être installées avec vos binaires, dans le même répertoire.

À mon avis, la meilleure pratique sous Windows consiste à placer les DLL à côté de vos fichiers binaires. CMake tente de rendre cela plus facile,

install(TARGETS MyTarget
  EXPORT "MyProjectTargets"
  RUNTIME DESTINATION "${INSTALL_RUNTIME_DIR}"
  LIBRARY DESTINATION "${INSTALL_LIBRARY_DIR}"
  ARCHIVE DESTINATION "${INSTALL_ARCHIVE_DIR}")

installerait les DLL dans la destination RUNTIME, mais placerait les bibliothèques dans la destination LIBRARY. Cela signifie que généralement sur les systèmes d'exploitation de type Unix, lib contient les objets partagés, mais CMake sait que les DLL sont effectivement exécutables et iraient dans bin. Espérons que cela rend les choses plus claires. Il est impossible pour CMake/Eclipse d'améliorer vraiment autant, au-delà peut-être d'injecter des répertoires supplémentaires dans votre PATH lorsque vous cliquez sur Exécuter depuis Eclipse (je ne sais pas si c'est possible).

Si vous êtes concerné par l'arborescence de construction, alors ce qui suit fonctionnerait bien là-bas (comme suggéré dans les commentaires ci-dessous) :

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

Si vous souhaitez autoriser leur remplacement (cela peut être utile), ils doivent également être protégés par des blocs if(NOT var_name).


Juste une réponse possible à ma propre question. Je pense que sous Linux, le rpath est utilisé pour identifier les emplacements des bibliothèques dépendantes, mais sous Windows avec mingw, je ne peux pas utiliser l'analyseur elf et donc je ne peux pas utiliser rpath.


Linux
  1. Comment initialiser une bibliothèque partagée sous Linux

  2. Comment ajouter un fichier .so au java.library.path sous Linux

  3. Construction multiplateforme sous Windows ciblant Linux à l'aide de CMake

  4. Lier une bibliothèque partagée avec une autre bibliothèque partagée sous Linux

  5. Comment faire un délai de bibliothèque partagée chargé sur Linux

Comment ajouter un hôte Linux et Windows distant à Icinga 2 pour la surveillance

Comment ajouter un hôte Windows et Linux au serveur Nagios pour la surveillance

5 meilleurs systèmes d'exploitation Linux pour remplacer Windows XP

6 distributions Linux pour remplacer Windows 10 et 7

Comment exécuter Windows 95 sous Linux

Sécurité Linux contre Windows