Quick links: Tutorial - Examples - Files - Symbols.
Classes: Hierarchy - Index - List - Members.
Namespaces: Index - base - cs - display.
This page is available in English.

Compilation de programmes utilisant Cogitant

Introduction

Cette section détaille la marche à suivre pour compiler un programme qui utilise la bibliothèque de classes Cogitant. Comme toute bibliothèque, Cogitant demande de prendre certaines précautions lors de la compilation de programmes pour que le compilateur puisse accéder aux fichiers headers de la bibliothèque et que le linker puisse lier l'exécutable produit à la bibliothèque. Nous supposerons que la bibliothèque a déjà été compilée (et installée dans des répertoires correctement configurés, dans le cas d'un système Unix). Se reporter à Installation de Cogitant si ce n'est pas le cas. Selon le mode de compilation qui a été choisie pour la bibliothèque (utilisation du script configure, ou utilisation de Cmake), la compilation de programmes utilisant Cogitant se fait de différentes façons. Cette section est donc divisée en deux sous-sections, qui correspondent aux deux méthodes de compilation de Cogitant.

Compilation basée sur configure/make

Cette section décrit comment compiler des programmes utilisant la bibliothèque Cogitant, dans le cas où cette bibliothèque a été construite par ./configure ; make ; make install, méthode qui peut être utilisée sous Unix, ainsi que sous MS Windows à condition d'utiliser Cygwin ou Mingw. Dans le cas où la compilation de Cogitant a été effectuée avec Cmake, reportez vous à la section Compilation basée sur Cmake.

Afin de simplifier la gestion des paramètres devant être passés au compilateur (chemin des fichiers headers, symboles du pré-processeur (#define) particuliers) et au linker (chemin contenant la bibliothèque, nom de la bibliothèque), nous avons utilisé un mécanisme proche de celui introduit par la bibliothèque GTK+ (http://www.gtk.org) qui consiste en l'utilisation d'un fichier script shell qui retourne les paramètres devant être passés au compilateur ou au linker. C'est l'utilisation de ce fichier qui est décrite ci-dessous. Par contre, ce script étant rédigé en sh, il ne peut être utilisé sous MS Windows (sauf dans le cas de l'utilisation de Cygwin on Mingw).

Le fichier cg-config

Le fichier cg-config est le script shell qui retourne les différents paramètres devant être passés au compilateur et au linker pour permettre la génération d'exécutables basés sur Cogitant. Ce fichier est automatiquement copié dans le répertoire contenant les binaires (/usr/bin ou /usr/local/bin) au moment de l'installation de la plate-forme (make install ou installation de package). Ce fichier doit donc être dans un répertoire dans le path. Pour le vérifier, taper :

cg-config

Si le script est trouvé, l'exécution de ce script doit provoquer l'affichage de la version de la plate-forme installée et des paramètres pouvant être passés au script. Il est cependant possible d'utiliser ce script même s'il ne figure pas dans le path. Dans ce cas, il faut bien sûr préfixer tout appel au script par le nom du répertoire dans lequel il se trouve. Cette fonctionnalité permet d'utiliser la plate-forme même si vous n'avez pas les droits d'administrateur sur la machine (écriture dans /usr). Dans ce cas, il est cependant conseillé, comme dans le cas de toute bibliothèque, de créer dans son répertoire utilisateur une hiérarchie usr reproduisant la structure de /usr (c'est à dire contenant des sous-répertoires bin (dans le path), doc, include, lib (dans le LD_LIBRARY_PATH), etc.) et de passer l'emplacement de ce répertoire au script de configuration (configure) des sources de la plate-forme.

Le but de cette documentation n'étant pas de décrire l'utilisation d'Unix, nous ne décrirons pas les manipulations devant être effectuées pour obtenir ce résultat et considérerons par la suite que les fichiers de la plate-forme sont correctement installés dans des répertoires. Se reporter au "gourou Unix" à votre disposition si vous ne vous sentez pas capable de réaliser ces opérations. Évidemment, ces manipulations n'ont pas a être effectuées si la plate-forme est installée dans /usr, que ce soit à la suite d'une installation à partir des sources avec les droits d'administrateur ou d'une installation à partir d'un package RPM.

Compilation

Les paramètres particuliers devant être passés au compilateur concernent deux domaines :

De tels paramètres sont envoyés sur la sortie standard lorsque le script cg-config est appelé avec le paramètre –cflags. Ainsi, pour compiler un fichier main.cpp utilisant les classes de Cogitant, il est possible de définir une dépendance dans le Makefile de votre programme de la façon suivante :

main.o: main.cpp
$(CXX) `cg-config --cflags` -c $<

Édition de liens

Les paramètres devant être passés au linker concernent le chemin dans lequel la bibliothèque (archive ou bibliothèque dynamiquement liée) Cogitant est stockée. Ces paramètres sont envoyés sur la sortie standard lorsque le script cg-config est appelé avec le paramètre –libs. Ainsi, pour l'édition de liens d'un programme appelé test et construit à partir d'un seul fichier objet appelé main.o, il est possible de définir cette dépendance :

test: main.o
$(CXX) `cg-config --libs` -o test main.o

Exemple de Makefile

Le fichier suivant peut être utilisé comme modèle pour la compilation de programmes utilisant la bibliothèque (construction d'un exécutable nommé minimal à partir d'un fichier source minimal.cpp). Il peut être nécessaire de modifier la ligne PROGRAM= afin de choisir le nom de l'exécutable résultat et la ligne SOURCES= pour préciser les noms des fichiers sources qui forment le programme à construire (extension cpp, utiliser l'espace comme séparateur).

# CoGITaNT 5
# Construction d'un programme (Unix, methode standard, bibliotheque installee)
# David Genest
PROGRAM = minimal
SOURCES = minimal.cpp
CXXFLAGS = `cg-config --cflags`
LDFLAGS = `cg-config --libs`
OBJECTS = $(SOURCES:.cpp=.o)
$(PROGRAM): $(OBJECTS)
$(CXX) $(OBJECTS) $(LDFLAGS) -o $(PROGRAM)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $<
clean:
$(RM) $(OBJECTS) $(PROGRAM)

Utilisation avancée : Utilisation de cg-config sans installer la bibliothèque

Si la bibliothèque est compilée à partir des sources (et non installée à partir d'un package), il est possible de construire des programmes l'utilisant sans installer les fichiers de la bibliothèque dans une hiérarchie usr (c'est-à-dire sans exécuter make install). Pour cela, il faut préciser lors de l'appel au script cg-config le chemin contenant la bibliothèque (c'est-à-dire le chemin contenant les répertoires src, include, etc. obtenus après décompression de l'archive contenant les sources). Pour cela, il est possible d'utiliser le paramètre –prefix. Ce paramètre doit être passé au script avant tous les autres. Par exemple, dans ce cas où les fichiers de la plate-forme résident dans ../cogitant par rapport au répertoire courant, la dépendance de compilation devient :

main.o: main.cpp
$(CXX) `../cogitant/src/cg-config --prefix=../cogitant --cflags` -c $<

Les modifications du Makefile concernent le nom du fichier de script, et plus particulièrement la précision du répertoire dans lequel figure ce fichier, et l'utilisation du paramètre –prefix qui force le script à retourner des chemins relatifs à ../cogitant pour les fichiers headers et l'archive de la bibliothèque.

À noter que si vous créez un exécutable avec liaison dynamique (sur les systèmes offrant cette possibilité, tels que GNU/Linux, où le résultat d'une édition de liens est par défaut un exécutable dynamiquement lié), il est bien sûr nécessaire de définir la variable d'environnement LD_LIBRARY_PATH car sinon l'exécution du programme résultat sera impossible car la bibliothèque dynamique ne sera pas accessible (consulter le manuel Unix sur ce sujet : man ldd).

Compilation basée sur Cmake

Cette section décrit comment compiler des programmes utilisant la bibliothèque Cogitant, dans le cas où cette bibliothèque a été construite à l'aide de Cmake, méthode qui est utilisée sous MS Windows avec VisualC++, mais qui peut aussi être utilisée sous Unix. Dans le cas où la compilation de Cogitant a été effectuée par un ./configure ; make ; make install, reportez vous à la section Compilation basée sur configure/make.

Lors de la compilation de Cogitant, Cmake a créé un certain nombre de fichiers nécessaires au compilateur utilisé. Ces fichiers sont différents selon le compilateur choisi. Mais dans tous les cas, ces fichiers résident dans un répertoire qui peut être le répertoire contenant les sources de Cogitant, ou un autre (ce qui est préférable). Dans la documentation de Cogitant, nous avons pris l'exemple d'une compilation de Cogitant dans le répertoire D:\cogitant-5.x.x\cmake sous MS Windows (choisi dans Where to build the binaries de Cmake) et dans le sous-répertoire cmake du répertoire contenant les sources de Cogitant sous Unix. Nous appelerons ce répertoire répertoire de construction de Cogitant. Ce répertoire de construction contient une partie de l'aborescence du répertoire des sources, et le fichier qui nous intéresse plus particulièrement se trouve dans include/cogitant et s'appelle CMakeCogitant.txt. Il est généré par Cmake, en fonction des choix faits par l'utilisateur lors de la configuration de la compilation de Cogitant. Ce fichier définit un certain nombre de variables Cmake qui vont nous permettre d'écrire simplement un fichier CMakeLists.txt pour compiler notre propre programme utilisant Cogitant. En fait, il suffit d'inclure ce fichier dans son CMakeLists.txt et de déclarer ensuite son propre programme, qui sera automatiquement compilé en utilisant les répertoires de Cogitant contenant les fichiers headers. Ainsi, pour compiler une application à partir de deux fichiers sources f1.cpp et f2.cpp et basée sur Cogitant, on pourra utiliser le fichier CMakeLists.txt suivant :

cmake_minimum_required(VERSION 2.6.3)
PROJECT(testcmake CXX)
SET(COGITANTDIR /home/user/sources/cogitant-5.x.x/cmake)
INCLUDE(${COGITANTDIR}/include/cogitant/CMakeCogitant.txt)
ADD_EXECUTABLE(testcmake f1.cpp f2.cpp)

La variable COGITANTDIR du fichier devra avoir comme valeur le répertoire de construction de Cogitant afin d'inclure le bon fichier (et non pas le répertoire contenant les sources de Cogitant). Une fois que le fichier CMakeLists.txt a été créé, la compilation de votre application peut se faire de la façon habituelle avec Cmake, c'est-à-dire en appelant d'abord Cmake afin qu'il analyse les fichiers CMakeLists.txt et crée les fichiers nécessaires à la compilation (Makefile ou fichiers projets), puis le compilateur sur les fichiers créés. Pour une utilisation plus précise de CMakeCogitant.txt, vous pouvez consulter ce fichier et voir quelles variables sont définies. De même, n'hésitez pas à consulter la documentation de Cmake pour plus d'informations.