À 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
Très intéressant cette démarche. Je ne pensais pas que c’était possible. Je suis en train de travailler avec Boost à la fois sur GNU/Linux (Debian) et sur Windows (plus par nécessité que par plaisir). Il faudrait que j’essaie.
Merci pour les explications et les références utiles (qui manquent parfois cruellement au billet de blog).
j’ai pas trouver le l’emplacement du compilateur
« echo « using gcc : mingw64 : i686-w64-mingw32-g++ : 4.6; » > user-config.jam »