Cross-compilation de Boost pour Windows sous Linux
À propos de l’auteur : Fabien Danieau est doctorant à Rennes, entre l’INRIA et Technicolor. Titulaire d’un diplôme d’Ingénieur en Cognitique, ses travaux portent actuellement sur l’application des interfaces haptiques pour le multimédia.
Récemment j’ai eu besoin de cross-compiler la librairie Boost nécessaire à un projet. Ce ne fût pas chose évidente, j’ai pensé qu’un retour d’expérience pourrait être utile à plus d’un.
Dans notre cas nous allons voir comment compiler Boost 1.47 pour Windows 32 bits sous une machine Linux ( la procédure décrite a été testée sous Debian Squeeze 64bits et Fedora 14 64bits).
Pré-requis
La librairie Boost se récupère aisément sur le site officiel. Pour la compilation j’ai utilisé mingw-w32-bin_x86_64-linux_20110818. Le nom indique qu’il va compiler des projets pour Windows 32bits (w32) et cette compilation se fera sous une machine linux 64 bits (x86_64-linux). On trouve ce compilateur sur le site officiel de mingw.
Pour la suite du tuto nous considéreront que les deux archives récupérées sont décompressées dans un dossier « BoostBuild » situé à la racine de notre home. Nous obtenons donc l’architecture suivante.
BoostBuild -- boost_1_47 -- mingw-w32-bin_x86_64-linux_20110818 |
Plaçons nous dans le répetoire boost_1_47 et attaquons les choses sérieuses!
cd ~ cd BoostBuild/boost_1_47 |
Procédure
Premièrement il faut créer un petit fichier de configuration pour indiquer à boost d’utiliser mingw comme compilateur.
echo "using gcc : mingw64 : i686-w64-mingw32-g++ : 4.6;" > user-config.jam |
Ceci ne suffisant pas pour que l’emplacement du compilateur soit trouvé, nous allons modifier temporairement la variable PATH. Le compilateur (i686-w64-mingw32-g++) se trouve dans le dossier mingw-w32-bin_x86_64-linux_20110818/bin.
PATH=/home/fabien/BoostBuild/mingw-w32-bin_x86_64-linux_20110818/bin:$PATH |
Cette commande fonctionnera chez les utilisateurs de Debian et autres dérivés. Les possesseurs d’une Fedora utiliseront plutôt celle-ci.
setenv PATH /home/fabien/BoostBuild/mingw-w32-bin_x86_64-linux_20110818/bin:$PATH |
Ensuite, comme indiqué dans la documentation de Boost, il faut appeler le script bootstrap.sh.
sh bootstrap.sh |
Dans mon cas le script n’a pas abouti pour cause de « Permission Denied ». En effet celui-ci essaie d’en appeler une autre, build.sh, qui n’est pas exécutable. D’où l’échec… Pour remédier à cela il suffit de faire:
chmod +x tools/build/v2/engine/build.sh |
Enfin nous arrivons à la dernière étape, la fameuse compilation de boost. Il faut lancer la commande «./b2» comme nous l’indique le script bootstrap.sh une fois sa tâche terminée. Cependant nous devons lui passer quelques paramètres spécifique à notre cross-compilation.
./b2 --user-config=user-config.jam --layout=versioned --toolset=gcc-mingw64 define=BOOST_USE_WINDOWS_H address-model=32 variant=debug,release link=static,shared threadapi=win32 target-os=windows stage |
« user-config » et « toolset » indiquent le compilateur à utiliser. « define », « address-model » et « target-os » spécifient que l’os cible est windows 32 bits. « variant » et « link » déterminent que l’on veut compiler ici les librairies dynamiques, statiques en version release et debug. Ces arguments sont à modifier suivant vos besoins. L’argument « layout » impose ici d’indiquer ces informations de version dans le nom des fichiers produits.
La compilation est en route, vous devriez voir les librairies apparaître dans le dossier boots_1_47/stage/lib. Cette étape peut prendre un peu de temps suivant les performances de votre machine. Pour une compilation plus rapide n’hésitez pas à utiliser l’argument supplémentaire « -j n » avec n le nombre de processeurs que vous possèdez.
Compilation pour Win64
Si cette article est dédiée à la compilation de la librairie Boost pour windows 32 bits, il est facile de l’adapter à windows 64 bits. Il vous faudra alors télécharger mingw64-w64 et modifier un peu les arguments de la dernière commande (address-model=64 entre autres). Je n’ai pas testé mais cela devrait fonctionner.
Anciennes versions de Boost
Si vous voulez compiler une ancienne version de boost (boost_1_46_1 par exemple) il ne faudra pas appeler « ./b2″ lors de la dernière étape mais « ./bjam ». L’ensemble des arguments restent les mêmes.
Références
Quelques références utiles.
- La doc officielle de Boost bien sûr
- Une page expliquant la compilation de Boost avec mingw64 sous windows
- Un article indiquant comment compiler une librairie spécifique dans boost (ici thread)
- Un autre article intéressant avec des infos sur la cross compilation, notamment de Boost