49 votes

Apprendre à compiler des choses à partir des sources (sur Unix/Linux/OSX)

Bien que j'installe des logiciels à partir de paquets (MacPorts / apt-get) dans la mesure du possible, je me retrouve souvent à devoir compiler des paquets à partir des sources. ./configure && make && sudo make install suffit généralement, mais il arrive que cela ne fonctionne pas - et dans ce cas, je suis souvent bloqué. Cela est presque toujours lié à d'autres dépendances de la bibliothèque d'une manière ou d'une autre.

J'aimerais apprendre ce qui suit :

  • Comment déterminer les arguments à passer à ./configure ?
  • Comment fonctionnent les bibliothèques partagées sous OS X / Linux - où elles se trouvent dans le système de fichiers, comment elles sont utilisées et comment elles sont utilisées. ./configure && make les trouve, ce qui se passe réellement lorsqu'elles sont reliées entre elles.
  • Quelles sont les différences réelles entre une bibliothèque partagée et une bibliothèque liée statiquement ? Pourquoi ne puis-je pas tout lier statiquement (la RAM et l'espace disque sont bon marché de nos jours) et ainsi éviter les conflits de versions de bibliothèques bizarres ?
  • Comment puis-je savoir quelles sont les bibliothèques que j'ai installées et quelles sont leurs versions ?
  • Comment puis-je installer plus d'une version d'une bibliothèque sans casser mon système normal ?
  • Si je am installer des choses à partir des sources sur un système qui est par ailleurs géré à l'aide de paquets, quelle est la manière la plus propre de le faire ?
  • En supposant que je parvienne à compiler quelque chose de compliqué à partir des sources, comment puis-je ensuite l'emballer pour que d'autres personnes n'aient pas à franchir les mêmes obstacles ? En particulier sur OS X....
  • Quels sont les outils en ligne de commande que je dois maîtriser pour être bon dans ce domaine ? Je ne sais pas si c'est le cas, mais c'est une bonne idée.

Je suis prêt à investir pas mal de temps et d'efforts ici - je ne veux pas nécessairement des réponses directes aux questions ci-dessus, je préférerais avoir des recommandations sur des livres / tutoriels / FAQ que je peux lire et qui me donneront les connaissances dont j'ai besoin pour comprendre ce qui se passe réellement et donc résoudre les problèmes par moi-même.

41voto

Darcy Points 61

Je m'excuse de répondre directement à tout, mais je ne connais pas de tutoriels utiles, de FAQ, etc. En fait, ce qui suit est le fruit de 8 ans de création d'applications de bureau (que j'aide à distribuer), de frustration et de recherches sur Google :

1. Comment déterminer les arguments à passer à ./configure ?

Pratiquer vraiment. Autotools est assez facile à utiliser car il est cohérent. Mais il y a beaucoup de choses qui utilisent cmake, ou des scripts personnalisés. En général, vous ne devriez pas avoir à passer quoi que ce soit à configure, il devrait déterminer si votre système peut construire foo-tool ou non.

Configure et les outils GNU recherchent tous des dépendances dans /, /usr et /usr/local. Si vous installez quoi que ce soit ailleurs (ce qui rend les choses difficiles si la dépendance a été installée par MacPorts ou Fink), vous devrez passer un drapeau pour configurer ou modifier l'environnement de Shell afin d'aider les outils GNU à trouver ces dépendances.

2. Comment fonctionnent les bibliothèques partagées sous OS X / Linux - où elles se trouvent dans le système de fichiers, comment ./configure && make les trouve, ce qui se passe réellement lorsqu'elles sont liées.

Sous Linux, ils doivent être installés sur un chemin que l'éditeur de liens dynamiques peut trouver, ce qui est défini par la directive LD_LIBRARY_PATH et le contenu du fichier /etc/ld.conf. Sur Mac, il en va de même pour la plupart des logiciels libres, presque toujours (à moins qu'il ne s'agisse d'un projet Xcode). Sauf que la variable d'environnement est DYLD_LIBRARY_PATH au lieu de cela.

Il existe un chemin par défaut dans lequel l'éditeur de liens recherche les bibliothèques. Il s'agit de /lib:/usr/lib:/usr/local/lib

Vous pouvez compléter cela en utilisant la variable CPATH, ou CFLAGS ou tout autre variable d'environnement (commodément compliquée). Je suggère d'utiliser CFLAGS comme suit :

export CFLAGS="$CFLAGS -L/nouveau/chemin"

Le paramètre -L ajoute au chemin de liaison.

Les produits modernes utilisent l'outil pkg-config. Les produits modernes que vous installez installent également un fichier .pc qui décrit la bibliothèque, son emplacement et la manière de s'y connecter. Cela peut vous faciliter la vie. Mais ce fichier n'est pas fourni avec OS X 10.5, vous devrez donc l'installer également. De plus, de nombreux programmes de base ne le supportent pas.

L'établissement de liens se résume à "résoudre cette fonction au moment de l'exécution", il s'agit en fait d'un grand tableau de chaînes de caractères.

3. Quelles sont les différences réelles entre une bibliothèque partagée et une bibliothèque liée statiquement ? Pourquoi ne puis-je pas tout lier statiquement (la RAM et l'espace disque sont bon marché de nos jours) et ainsi éviter les conflits de versions de bibliothèques bizarres ?

Lorsque vous créez un lien vers un fichier de bibliothèque statique, le code devient partie intégrante de votre application. C'est comme s'il existait un fichier .c géant pour cette bibliothèque et que vous le compiliez dans votre application.

Les bibliothèques dynamiques contiennent le même code, mais lorsque l'application est exécutée, le code est chargé dans l'application au moment de l'exécution (explication simplifiée).

Vous pouvez créer un lien statique vers tout, cependant, malheureusement, presque aucun système de construction ne rend cela facile. Vous devez éditer manuellement les fichiers du système de construction (par exemple Makefile.am, ou CMakeLists.txt). Cependant, cela vaut probablement la peine d'apprendre si vous installez régulièrement des choses qui nécessitent différentes versions de bibliothèques et que vous trouvez difficile d'installer des dépendances en parallèle.

L'astuce consiste à remplacer la ligne de lien -lfoo par -l/path/to/static/foo.a.

Vous pouvez probablement les trouver et les remplacer. Ensuite, vérifiez que l'outil n'établit pas de lien avec le .so ou la dylib en utilisant ldd foo ou otool -L foo.

Un autre problème est que toutes les bibliothèques ne se compilent pas en bibliothèques statiques. Beaucoup le font. Mais alors MacPorts ou Debian peuvent avoir décidé de ne pas les livrer.

4. Comment puis-je savoir quelles sont les bibliothèques que j'ai installées et quelles sont leurs versions ?

Si vous avez des fichiers pkg-config pour ces bibliothèques, c'est facile :

pkg-config --list-all

Sinon, il est souvent difficile de le faire. La dylib peut avoir un nom de son (par exemple, foo.0.1.dylib, le nom de son est 0.1) qui est le même que la version de la bibliothèque. Cependant, cela n'est pas nécessaire. Le soname est une caractéristique de calcul binaire, vous devez modifier la majeure partie du soname si vous changez le format des fonctions dans la bibliothèque. Vous pouvez donc obtenir, par exemple, un soname de la version 14.0.5 pour une bibliothèque 2.0. Bien que cela ne soit pas courant.

J'ai été frustré par ce genre de choses et j'ai développé une solution pour cela sur Mac, et j'en parle dans la suite de mon article.

5. Comment puis-je installer plus d'une version d'une bibliothèque sans casser mon système normal ?

Ma solution à ce problème se trouve ici : http://github.com/mxcl/homebrew/

J'aime installer à partir des sources, et je voulais un outil qui rende cela facile, mais avec une certaine gestion des paquets. Ainsi, avec Homebrew, je construis, par exemple, wget moi-même à partir des sources, mais je m'assure d'installer un préfixe spécial :

/usr/local/Cellar/wget/1.1.4

J'utilise ensuite l'outil homebrew pour établir un lien symbolique entre tout cela et /usr/local, de sorte que j'ai toujours /usr/local/bin/wget et /usr/local/lib/libwget.dylib.

Plus tard, si j'ai besoin d'une version différente de wget, je peux l'installer en parallèle et changer simplement la version qui est liée à l'arborescence /usr/local.

6. Si j'installe des choses à partir des sources sur un système qui est par ailleurs géré à l'aide de paquets, quelle est la manière la plus propre de le faire ?

Je pense que la méthode Homebrew est la plus propre, alors utilisez-la ou faites l'équivalent. Installez dans /usr/local/pkgs/nom/version et faites un lien symbolique ou un lien en dur avec le reste.

Utilisez /usr/local. Tous les outils de construction existants y recherchent des dépendances et des en-têtes. Votre vie sera beaucoup plus facile.

7. En supposant que je parvienne à compiler quelque chose de compliqué à partir des sources, comment puis-je ensuite l'empaqueter pour que d'autres personnes ne soient pas obligées de passer par les mêmes étapes ? En particulier sur OS X....

S'il n'y a pas de dépendances, vous pouvez récupérer le répertoire de construction et le donner à quelqu'un d'autre qui pourra alors faire "make install". Cependant, vous ne pouvez faire cela de manière fiable qu'avec les mêmes versions d'OS X. Sur Linux, cela fonctionnera probablement pour des Linux similaires (par exemple Ubuntu) avec la même version du noyau et la même version mineure de libc.

La raison pour laquelle il n'est pas facile de distribuer des binaires sous Unix est la compatibilité binaire. Les gens de GNU, et tous les autres, changent souvent leurs interfaces binaires.

En principe, il ne faut pas distribuer de binaires. Les choses se casseront probablement de manière très étrange.

Sur Mac, la meilleure option est de créer un paquet macports. Tout le monde utilise macports. Sous Linux, il y a tellement de systèmes de construction et de combinaisons différentes que je ne pense pas qu'il y ait de meilleur conseil que d'écrire un article de blog sur la façon dont vous avez réussi à construire x outil dans y configuration étrange.

Si vous faites une description du paquet (pour macports ou homebrew), alors tout le monde peut installer ce paquet, et cela résout aussi les problèmes de dépendance. Cependant, ce n'est souvent pas facile, et il n'est pas non plus facile d'inclure votre recette macports dans l'arbre principal de macports. De plus, macports ne supporte pas les types d'installation exotiques, ils offrent un seul choix pour tous les paquets.

Un de mes objectifs futurs avec Homebrew est de rendre possible de cliquer sur un lien sur un site web (ex. homebrew://blah et il téléchargera ce script, installera les deps pour ce paquet et ensuite construira l'application. Mais oui, ce n'est pas encore fait, mais ce n'est pas trop difficile vu le design que j'ai choisi.

8. Quels sont les outils en ligne de commande que je dois maîtriser pour être bon dans ce domaine ? Des choses comme otool, pkg-config etc.

otool n'est vraiment utile qu'après coup. Il vous indique les liens du binaire construit. Lorsqu'il s'agit de déterminer les dépendances d'un outil que vous devez construire, il est inutile. Il en va de même pour pkg-config, car vous aurez déjà installé la dépendance avant de pouvoir l'utiliser.

Ma chaîne d'outils est la suivante : lisez les fichiers README et INSTALL, et faites un configure --help. Regarder la sortie de la compilation pour vérifier qu'elle est saine. Analyser les éventuelles erreurs de compilation. Peut-être qu'à l'avenir, il faudra demander sur serverfault :)

12voto

C'est un vaste sujet, alors commençons par les bibliothèques partagées sur Linux (ELF sur Linux et Mach-O sur OS X), Ulrich Drepper a un bon article sur les bibliothèques partagées. introduction à la rédaction des DSO (objets dynamiques partagés) qui couvre une partie de l'histoire des bibliothèques partagées sous Linux, disponible ici, y compris les raisons de leur importance.

Ulrich explique également pourquoi les liens statiques sont considérés comme nuisibles l'un des points clés est la mise à jour de la sécurité. Les débordements de tampon dans une bibliothèque commune (par exemple zlib) qui est largement liée de manière statique peuvent entraîner un surcoût énorme pour les distributions - cela s'est produit avec zlib 1.1.3 ( Avis de Red Hat )

ELF

La page de manuel de l'éditeur de liens ld.so

man ld.so 

explique les chemins et les fichiers de base impliqués dans l'établissement de liens dynamiques au moment de l'exécution. Sur les systèmes Linux modernes, vous verrez des chemins supplémentaires ajoutés via /etc/ld.so.conf.d/, généralement par le biais d'une inclusion globale dans /etc/ld.so.conf.

Si vous voulez voir ce qui est disponible dynamiquement via votre configuration ld.so, vous pouvez lancer

ldconfig -v -N -X

La lecture du howto DSO devrait vous donner un bon niveau de connaissance de base pour ensuite comprendre comment ces principes s'appliquent à Mach-O sur OS X.

Mach-O

Sous OS X, le format binaire est Mach-O. La documentation du système local pour l'éditeur de liens est la suivante

man dyld

Les Documentation sur le format Mach est disponible auprès d'Apple

Outils de construction UNIX

Le commun configure , make , make install est généralement fourni par GNU autotools, qui dispose d'un outil de gestion de l'information. livre en ligne qui couvre une partie de l'histoire de la séparation configure/build et de la chaîne d'outils GNU. Autoconf utilise des tests pour déterminer la disponibilité des fonctionnalités sur le système de construction cible, il utilise la fonction Langage macro M4 pour conduire ce projet. Automake est essentiellement une méthode de création de modèles pour les Makefiles, le modèle étant généralement appelé Makefile.am qui produit un Makefile.in que la sortie d'autoconf (le script script) convertit en Makefile.

Les Bonjour GNU est un bon exemple pour comprendre la chaîne d'outils GNU - et le manuel inclut la documentation sur les autotools.

10voto

pradeep patra Points 1

Simon ! Je sais ce que vous ressentez ; j'ai également eu du mal avec cette partie de l'apprentissage de Linux. Sur la base de mes propres expériences, j'ai écrit un tutoriel sur certains des points que vous avez abordés (principalement comme référence pour moi-même !): http://easyaspy.blogspot.com/2008/12/buildinginstalling-application-from.html . Je pense que vous apprécierez ma remarque sur la simplicité de construction/installation des applications Python :)

J'espère que cela vous aidera ! Et bonne compilation.

Tim Jones


Construire/Installer une application à partir des sources sous Ubuntu Linux

Bien que les dépôts d'Ubuntu soient remplis d'excellentes applications, il vous arrivera un jour ou l'autre de tomber sur un outil indispensable qui n'est pas dans les dépôts (ou qui n'a pas de paquet Debian) ou dont vous avez besoin d'une version plus récente que celle qui se trouve dans les dépôts. Que faire ? Eh bien, vous devez construire l'application à partir des sources ! Ne vous inquiétez pas, ce n'est pas aussi compliqué que ça en a l'air. Voici quelques conseils, basés sur mon expérience d'amateur ! (Bien que j'utilise Ubuntu pour cet exemple, les concepts généraux devraient être applicables à la plupart des distributions Unix/Linux, telles que Fedora, et même la plateforme Cygwin sous Windows).

Le processus de base de construction (compilation) de la plupart des applications à partir des sources suit la séquence suivante : configurer --> compiler --> installer. Les commandes typiques d'Unix/Linux pour effectuer ces opérations sont les suivantes : config --> make --> make install . Dans certains cas, vous trouverez même des pages web qui montrent que tous ces éléments peuvent être combinés en une seule commande :

$ config && make && make install

Bien entendu, cette commande suppose qu'il n'y a pas de problème dans l'une ou l'autre de ces étapes. C'est là qu'on s'amuse !

Pour commencer

Si vous n'avez jamais compilé une application à partir des sources sur votre système, vous devrez probablement la configurer avec des outils de développement généraux, tels que le logiciel gcc des fichiers d'en-tête courants (il s'agit de code déjà écrit par quelqu'un d'autre et utilisé par le programme que vous êtes en train d'installer) et l'outil make. Heureusement, dans Ubuntu, il existe un métapackage appelé build-essential qui l'installera. Pour l'installer (ou simplement vérifier que vous l'avez déjà !), lancez cette commande dans le terminal :

$ sudo apt-get install build-essential

Maintenant que vous disposez de la configuration de base, téléchargez les fichiers sources de l'application et enregistrez-les dans un répertoire pour lequel vous disposez des droits de lecture/écriture, comme votre répertoire "personnel". En général, ces fichiers se trouvent dans un fichier d'archive dont l'extension est soit .tar.gz o .tar.bz2 . Les .tar signifie simplement qu'il s'agit d'une "archive sur bande", c'est-à-dire d'un regroupement de fichiers qui préserve leur structure de répertoire relative. Les .gz est l'abréviation de gzip (GNU zip), un format de compression populaire sous Unix/Linux. De même, l'extension .bz2 signifie bzip2, un format de compression plus récent qui offre une compression plus élevée (taille de fichier compressé plus petite) que gzip.

Après avoir téléchargé le fichier source, ouvrez une fenêtre de terminal (System Terminal dans le menu Ubuntu) et placez-vous dans le répertoire où vous avez enregistré votre fichier. (J'utiliserai ~/download dans cet exemple. Ici, "~" est un raccourci vers votre répertoire "personnel"). Utilisez la commande tar pour extraire les fichiers de l'archive téléchargée :

Si votre fichier est une archive gzip (c'est-à-dire qu'il se termine par .tar.gz ), utilisez la commande :

            $ tar -zxvf filename.tar.gz

Si votre fichier est une archive bzip2 (par exemple, il se termine par .tar.bz2 ), utilisez la commande :

            $ tar -jxvf filename.tar.gz

Conseil : si vous ne voulez pas avoir à vous se souvenir de tous les commutateurs de la ligne de commande pour extraire des archives, je vous recommander l'un de ces utilitaires (ou les deux) ces utilitaires : dtrx (mon préféré !) ou deco (plus populaire). Avec l'un ou l'autre l'un ou l'autre de ces utilitaires, il suffit d'entrer le nom de l'utilitaire (dtrx ou deco) et le nom du fichier. le nom du fichier, et il fait tout le reste. le reste. Ces deux utilitaires "savent" comment gérer la plupart des formats d'archives que vous êtes susceptible de et ils ont une excellente gestion des erreurs.

Lorsque vous construisez à partir d'une source, vous risquez de rencontrer deux types d'erreurs :

  1. Les erreurs de configuration se produisent lorsque vous exécutez le script de configuration script (généralement appelé config ou configure) pour créer un fichier makefile spécifique à votre installation.
  2. Les erreurs de compilation se produisent lorsque vous exécutez la commande make (après que le fichier makefile a été généré) et que le compilateur ne parvient pas à trouver le code dont il a besoin.

Nous allons examiner chacun de ces problèmes et voir comment les résoudre.

Configuration et erreurs de configuration

Après avoir extrait le fichier d'archive du code source, dans le terminal, vous devez vous rendre dans le répertoire qui contient les fichiers extraits. Généralement, le nom de ce répertoire sera le même que le nom du fichier (sans l'extension .tar.gz o .tar.bz2 ). Cependant, il arrive que le nom du répertoire soit simplement le nom de l'application, sans aucune information sur la version.

Dans le répertoire source, recherchez un fichier README et/ou un fichier INSTALL (ou quelque chose de similaire). Ces fichiers contiennent généralement des informations utiles sur la manière de construire/compiler l'application et de l'installer, y compris des informations sur les dépendances. Les "dépendances" ne sont qu'un nom fantaisiste pour désigner d'autres composants ou bibliothèques nécessaires à la réussite de la compilation.

Après avoir lu le README et/ou INSTALL (et, si possible, de la documentation en ligne relative à l'application), recherchez un fichier exécutable (pour lequel l'autorisation "x" a été définie) nommé config o configure . Parfois, le fichier peut avoir une extension, telle que .sh (par exemple, config.sh ). Il s'agit généralement d'un Shell Shell qui exécute d'autres utilitaires pour confirmer que vous disposez d'un environnement "sain" pour la compilation. En d'autres termes, il vérifie que vous avez installé tout ce dont vous avez besoin.

Conseil : s'il s'agit d'une application basée sur Python basée sur Python vous devriez trouver un fichier nommé setup.py . Les applications Python sont généralement très très simples à installer. Pour installer cette application en tant que root (par exemple devant la commande suivante sous Ubuntu), exécutez cette commande :

    $ python setup.py install

C'est tout ce qu'il faut faire. à faire. Vous pouvez sauter le reste de ce et passer directement à l'utilisation et profiter de votre application.

Exécutez le script de configuration script dans le terminal. Typiquement, vous pouvez (et devriez !) exécuter votre configuration script avec votre compte utilisateur normal.

$ ./config

Le script affiche quelques messages pour vous donner une idée de ce qu'il fait. Souvent, le script vous indiquera s'il a réussi ou échoué et, s'il a échoué, vous donnera des informations sur la cause de l'échec. Si vous n'obtenez aucun message d'erreur, vous pouvez généralement supposer que tout s'est bien passé.

Si vous ne trouvez aucun script qui ressemble à une configuration script, cela signifie généralement que l'application est très simple et qu'elle est indépendante de la plate-forme. Cela signifie que vous pouvez simplement passer à l'étape de construction/compilation ci-dessous, car le fichier Makefile devrait fonctionner sur n'importe quel système.

Un exemple

Dans ce tutoriel, je vais utiliser le lecteur RSS textuel Newsbeuter comme exemple des types d'erreurs que vous pouvez rencontrer lors de la construction de votre application. Pour Newsbeuter, le nom de la configuration script est config.sh . Sur mon système, lorsque je lance config.sh les erreurs suivantes se produisent :

tester@sitlabcpu22:~/download/newsbeuter-1.3$ ./config.sh
Checking for package sqlite3... not found

You need package sqlite3 in order to compile this program.
Please make sure it is installed.

En faisant quelques recherches, j'ai découvert qu'en fait, la sqlite3 a été installée. Cependant, comme j'essaie de construire à partir des sources, il s'agit d'une astuce que je ne peux pas utiliser. config.sh recherche en fait les bibliothèques de développement (en-têtes) pour le programme sqlite3 . Dans Ubuntu, la plupart des paquets ont un équivalent de développement associé qui se termine par -dev . (D'autres plateformes, telles que Fedora, utilisent souvent un suffixe de paquetage de type -devel pour les paquets de développement).

Pour trouver le paquetage approprié pour le sqlite3 nous pouvons utiliser le paquet de développement apt-cache dans Ubuntu (et, de la même manière, l'utilitaire yum dans Fedora) :

tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-cache search sqlite

Cette commande renvoie une liste assez longue de résultats, nous devons donc faire un peu de travail de détective pour déterminer quel est le paquet approprié. Dans ce cas, le paquet approprié s'avère être libsqlite3-dev . Remarquez que parfois le paquet que nous recherchons aura l'extension lib au lieu du même nom de paquet avec le préfixe -dev . En effet, nous recherchons parfois une bibliothèque partagée qui peut être utilisée par de nombreuses applications différentes. Pour installer libsqlite3-dev Lancez la commande apt-get install dans le terminal :

tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-get install libsqlite3-dev

Maintenant, nous devons exécuter config.sh pour s'assurer que nous avons résolu ce problème de dépendance et que nous n'en aurons plus d'autres. (Bien que je ne le montre pas ici, dans le cas de Newsbeuter, j'ai également dû installer le paquetage libcurl4-openssl-dev ). De plus, si vous installez un paquet de développement (comme libsqlite3-dev ) et le paquet d'applications associé (par exemple, sqlite3 ) n'est pas déjà installé, la plupart des systèmes installeront automatiquement le paquetage d'application associé en même temps.

Lorsque la configuration s'exécute avec succès, elle crée un ou plusieurs fichiers make. Ces fichiers sont généralement nommés Makefile (n'oubliez pas que la casse des noms de fichiers est importante sous Unix/Linux !) Si le paquetage de construction comprend des sous-répertoires, tels que src etc., chacun de ces sous-répertoires contiendra un fichier Makefile Le projet est également en cours d'élaboration.

Erreurs de construction et de compilation

Nous sommes maintenant prêts à compiler l'application. Cette étape est souvent appelée construction et le nom est emprunté au processus de construction de quelque chose dans le monde réel. Les différents "morceaux" de l'application, qui sont généralement plusieurs fichiers de code source, sont combinés pour former l'application globale. L'utilitaire make gère le processus de construction et appelle d'autres applications, telles que le compilateur et l'éditeur de liens, pour effectuer le travail. Dans la plupart des cas, il vous suffit d'exécuter make (avec votre compte utilisateur habituel) à partir du répertoire où vous avez exécuté la configuration. (Dans certains cas, comme la compilation d'applications écrites avec la bibliothèque Qt, vous devrez lancer une autre application "wrapper" comme qmake. Encore une fois, vérifiez toujours l'option README et/ou INSTALL pour plus de détails).

Comme pour la configuration script ci-dessus, lorsque vous lancez make (ou un utilitaire similaire) dans le terminal, il affiche des messages sur ce qui s'exécute et sur les éventuels avertissements et erreurs. Vous pouvez généralement ignorer les avertissements, car ils sont principalement destinés aux développeurs de l'application et leur indiquent que certaines pratiques standard sont violées. En général, ces avertissements n'affectent pas le fonctionnement de l'application. En revanche, les erreurs de compilation doivent être traitées. Avec Newsbeuter, lorsque j'ai lancé make, tout s'est bien passé pendant un moment, mais j'ai ensuite obtenu une erreur :

tester@sitlabcpu22:~/download/newsbeuter-1.3$ make
...
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/configparser.o -c src/configparser.cpp
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/colormanager.o -c src/colormanager.cpp
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:5:18: error: stfl.h: No such file or directory
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:33: error: ISO C++ forbids declaration of \u2018stfl_form\u2019 with no type
./include/stflpp.h:33: error: expected \u2018;\u2019 before \u2018*\u2019 token
./include/stflpp.h:34: error: ISO C++ forbids declaration of \u2018stfl_ipool\u2019 with no type
./include/stflpp.h:34: error: expected \u2018;\u2019 before \u2018*\u2019 token
make: *** [src/colormanager.o] Error 1

Le processus de création s'arrêtera dès que la première erreur sera rencontrée. La gestion des erreurs du compilateur est parfois délicate. Vous devez examiner les erreurs pour trouver des indices sur le problème. Généralement, le problème est que certains fichiers d'en-tête, qui ont généralement une extension de .h o .hpp sont manquants. Dans le cas de l'erreur ci-dessus, il est (ou devrait être !) clair que le problème est que stfl.h est introuvable. Comme le montre cet exemple, il convient d'examiner les premières lignes du message d'erreur et de remonter jusqu'à la cause sous-jacente du problème.

Après avoir consulté la documentation de Newsbeuter (ce que j'aurais dû faire avant de commencer, mais alors cette partie du tutoriel n'aurait pas eu beaucoup de sens !), j'ai découvert qu'il nécessite une bibliothèque tierce appelée STFL. Que faisons-nous dans ce cas ? Eh bien, nous répétons essentiellement le même processus pour la bibliothèque requise : nous obtenons la bibliothèque et exécutons le processus configure-build-install pour elle, puis nous reprenons la construction de l'application souhaitée. Par exemple, dans le cas de STFL, j'ai dû installer la bibliothèque libncursesw5-dev pour qu'il se construise correctement. (En général, il n'est pas nécessaire de refaire l'étape de configuration de notre application d'origine après l'installation d'une autre application requise, mais cela ne fait jamais de mal non plus).

Après avoir installé avec succès la boîte à outils STFL, le processus make pour Newsbeuter s'est déroulé avec succès. Le processus make reprend généralement là où il s'est arrêté (à l'endroit de l'erreur). Ainsi, les fichiers qui ont déjà été compilés avec succès ne seront pas recompilés. Si vous souhaitez tout recompiler, vous pouvez lancer make clean all pour supprimer tous les objets compilés, puis relancer make.

Installation

Une fois que le processus de construction s'est achevé avec succès, vous êtes prêt à installer l'application. Dans la plupart des cas, il est préférable d'installer l'application dans les zones communes du système de fichiers (par ex, /usr/bin o /usr/share/bin etc.), vous devrez exécuter l'installation en tant que root. L'installation est vraiment l'étape la plus simple de tout le processus. Pour l'installer, dans le terminal, exécutez

$ make install

Vérifier que le résultat de ce processus ne comporte pas d'erreurs. Si tout s'est déroulé correctement, vous devriez pouvoir exécuter le nom de la commande dans le terminal et celle-ci se lancera. (Ajoutez & à la fin de la ligne de commande, s'il s'agit d'une application GUI, sinon vous ne pourrez pas utiliser la session de terminal tant que l'application n'aura pas fini de s'exécuter).

Lorsque vous créez une application à partir des sources, elle n'ajoute généralement pas d'icône ou de raccourci dans les menus de l'interface graphique d'Ubuntu. Vous devrez l'ajouter manuellement.

C'est en gros le processus, bien que potentiellement itératif, de construction et d'installation d'une application à partir des sources dans Ubuntu. Après l'avoir fait plusieurs fois, cela deviendra une seconde nature pour vous !

6voto

Aaron Brady Points 121

Eh bien, ./configure --help vous donnera beaucoup d'informations sur les fichiers configure générés par GNU autotools. La plupart se résument à --with/--without pour activer des fonctionnalités (celles-ci peuvent prendre un paramètre supplémentaire, comme "shared" pour indiquer où trouver la bibliothèque).

D'autres éléments importants sont --prefix (qui prend par défaut /usr/local/ la plupart du temps) pour indiquer où installer (si vous construisez des paquets, vous voulez généralement --prefix=/usr ou peut-être --prefix=/opt/YourPackage).

Sous Linux, /lib, /usr/lib et /usr/local/lib sont généralement recherchés par gcc et inclus dans la configuration par défaut de ldconfig. À moins que vous n'ayez une bonne raison, c'est là que vous devez placer vos bibliothèques. Le fichier /etc/ld.so.conf peut cependant contenir des entrées supplémentaires.

configure et make les trouvent en essayant simplement d'exécuter "gcc -l" et en voyant s'il y a des erreurs. Vous pouvez ajouter "-L" à votre paramètre CFLAGS pour ajouter des chemins supplémentaires à rechercher.

Vous pouvez avoir plusieurs versions installées, et les logiciels liés à une ancienne version resteront liés à celle-ci (exécutez ldd pour connaître le binding sous Linux), mais les nouvelles compilations ciblent généralement la dernière version d'une bibliothèque dynamique sur votre système.

La plupart des logiciels supposent des librairies dynamiques, en particulier s'ils utilisent libtool, de sorte que vous pouvez constater que des applications non triviales ne se construisent pas correctement de manière statique.

ls -l est le meilleur moyen de trouver les bibliothèques installées.

Et c'est là que je manque d'informations ; comment bien jouer avec les paquets : je ne sais pas. Lorsque c'est possible, j'essaie d'emballer les choses dans un paquet pour éviter le problème.

4voto

Rob Pilkington Points 344

Pour répondre à une partie de votre question, j'ai trouvé l'autre jour un bon moyen de voir quelles bibliothèques vous avez installées et leurs versions (c'est sous Linux Debian, donc cela devrait fonctionner avec d'autres versions également).

dpkg --list

Vous devriez obtenir une liste très longue avec un résultat comme celui-ci

ii  libssl0.9.8    0.9.8c-4etch5  SSL shared libraries
ii  libssp0        4.1.1-21       GCC stack smashing protection library
ii  libstdc++5     3.3.6-15       The GNU Standard C++ Library v3
ii  libstdc++5-3.3 3.3.6-15       The GNU Standard C++ Library v3 (development
ii  libstdc++6     4.1.1-21       The GNU Standard C++ Library v3

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X