Je ne suis pas nouveau en C++ bien que je sois nouveau sous Linux. J'utilise CMake pour précompiler un moteur de jeu multiplateforme avec des composants tiers, mais j'ai beaucoup de doutes sur l'utilisation des bibliothèques. Ma question est de savoir comment travailler avec des bibliothèques tierces et où les mettre. Apt installe les bibliothèques à leur place officielle (/ usr/local,/usr/lib/..) mais je développe sous Windows en utilisant des bibliothèques locales qui se trouvent dans un dossier dans mon répertoire de projet.
De plus, j'ai besoin d'un bon tutoriel pour connaître les règles de fonctionnement des bibliothèques. Par exemple: lors de la compilation de mon projet, luabind demande liblua.s0.1, mais AFAIK il n'y a aucun moyen de générer cette bibliothèque avec la source fournie par Lua (au moins faire make, make install).
Je sais, cette question est floue mais je n'ai pas assez d'expérience pour être plus concis.
Mise à jour: Après avoir lu certaines réponses, une question plus concise est la suivante. Si j'installe toutes les bibliothèques tierces, comment puis-je distribuer mon programme? Comment gérer les dépendances sans utiliser un fichier Lisezmoi volumineux?
Où mettre les bibliothèques
La meilleure solution consiste à utiliser le système de packaging de votre distribution Linux (apt-get
, yum
, ou similaire) pour installer des bibliothèques à partir de packages fournis par la distribution dans la mesure du possible.
Si les bibliothèques empaquetées de la distribution ne sont pas d'une version assez récente, ou si vous avez besoin d'options de construction non standard, ou si vous avez besoin d'une bibliothèque que votre distribution ne fournit pas, vous pouvez la construire et l'installer vous-même. Vous disposez de deux options principales pour l'emplacement de la bibliothèque:
/usr/local
(bibliothèques sous /usr/local/lib
, en-têtes sous /usr/local/include
). Cela installe les bibliothèques à l'échelle du système et est probablement la solution la plus simple, car vous devriez alors pouvoir les construire sans prendre de mesures supplémentaires. N'installez PAS de bibliothèques directement sous /usr
, car cela va interférer avec le système d'emballage de votre distribution.LD_LIBRARY_PATH
ou ld.so.conf
- voir le lien pour plus de détails).Fonctionnement des bibliothèques
Voir l'excellent David A. Wheeler Programming Library HOWTO . Je recommanderais de lire cela, puis de poster des questions spécifiques en tant que nouveaux sujets.
Comment distribuer votre programme
Traditionnellement, les programmes Unix/Linux n'incluent pas de copies de leurs dépendances. Il appartient plutôt à l'utilisateur final ou au développeur d'installer ces dépendances elles-mêmes. Cela peut nécessiter un "grand fichier README", comme vous l'avez dit, mais il présente quelques avantages:
Si vous distribuez votre programme à des utilisateurs finaux, vous pouvez envisager de proposer un package (.dpkg
ou .rpm
) qu'ils pouvaient simplement télécharger et installer sans avoir à utiliser la source. Idéalement, du point de vue de l'utilisateur final, le package serait ajouté aux référentiels des distributions (s'il est open source ou au moins librement disponible) afin que les utilisateurs puissent le télécharger à l'aide de leurs gestionnaires de packages (apt-get
ou yum
). Tout cela peut devenir compliqué, en raison du grand nombre de distributions Linux, mais d'une compatibilité Debian/Ubuntu .dpkg
et compatible avec Red Hat/CentOS/Fedora .rpm
devrait couvrir un bon pourcentage d'utilisateurs finaux. La construction de packages n'est pas trop difficile, et il existe de bons howtos en ligne.
pour la première partie de votre question concernant Windows: il n'y a pas de véritable place standard pour les bibliothèques/en-têtes sur Windows, donc la solution simple est: créez la vôtre. Fournissez simplement une seule lib/et include/sur votre système et faites en sorte que tous vos projets l'utilisent (en définissant le chemin dans un fichier cmake que vous incluez partout). Mettez toutes les bibliothèques tierces dedans, par exemple:
tes projets:
d:/projects/projectA
d:/projects/projectB
trucs tiers:
d:/api/lib/lua.lib
d:/api/include/lua/....
(vous pouvez même utiliser des liens symboliques alias "jonctions de répertoire" si vous avez une version différente)
et le fichier cmake correspondant:
include_directories( d:/api/include )
link_directories( d:/api/lib )
D'accord, c'est donc l'une des questions fondamentales et même si je ne suis peut-être pas très clair à ce sujet, voici:
Voilà l'essentiel.
Si vous avez des bibliothèques spécifiques, vous pouvez les ajouter à votre propre projet lib/
et include/
répertoires et ajoutez-les respectivement au chemin d'inclusion et au chemin de bibliothèque.
L'ajout de ces répertoires à ces chemins peut se faire de plusieurs manières, selon la façon dont vous générez le projet. Je suis sûr qu'il y a quelque chose appelé LD_PATH impliqué dans tout cela ... Mais je ne connais pas vraiment les détails impliqués avec CMake.
Un peu de recherche sur Google peut vous aider à faire ce qui précède avec CMake.
J'espère que cela pourra aider,
jrh
Si vous installez les bibliothèques avec un gestionnaire de paquets, elles se retrouveront probablement toutes au bon endroit. Sinon, vous pouvez demander au compilateur de rechercher le en fournissant le chemin de recherche supplémentaire en utilisant le -L <path>
drapeau. Vous devriez pouvoir passer ce drapeau supplémentaire à CMake.
Soit dit en passant, le -I <path>
peut être utilisé pour ajouter un répertoire supplémentaire pour rechercher des fichiers d'inclusion.