Cross-compilation de boost pour Windows sur Linux
Je suis en train de créer mingw binaires pour boost sur une machine Linux. Le compilateur mingw est présent sur mon système comme /usr/bin/i586-mingw32msvc-g++ et j'ai été en mesure de créer un simple HelloWorld.exe application.
Voici une liste exacte de mes actions:
$ tar xvf boost_1_46_1.tar.gz
$ cd boost_1_46_1/
$ echo "using gcc : 4.4.4: i586-mingw32msvc-g++ ;" > user-config.jam
$ ./bootstrap.sh
$ ./bjam toolset=gcc target-os=windows
Le résultat est le suivant:
Building the Boost C++ Libraries.
...found 83 targets...
...updating 9 targets...
common.mkdir bin.v2
common.mkdir bin.v2/libs
common.mkdir bin.v2/libs/regex
common.mkdir bin.v2/libs/regex/build
common.mkdir bin.v2/libs/regex/build/gcc-mingw-4.4.4
common.mkdir bin.v2/libs/regex/build/gcc-mingw-4.4.4/debug
common.mkdir bin.v2/libs/regex/build/gcc-mingw-4.4.4/debug/target-os-windows
gcc.compile.c++ bin.v2/libs/regex/build/gcc-mingw-4.4.4/debug/target-os-windows/has_icu_test.o
In file included from /usr/include/unicode/pwin32.h:123,
from /usr/include/unicode/umachine.h:47,
from /usr/include/unicode/uversion.h:47,
from libs/regex/build/has_icu_test.cpp:12:
/usr/include/inttypes.h:290: warning: ISO C++ 1998 does not support ‘long long’
/usr/include/inttypes.h:291: warning: ISO C++ 1998 does not support ‘long long’
libs/regex/build/has_icu_test.cpp: In function ‘int main()’:
libs/regex/build/has_icu_test.cpp:24: warning: unused variable ‘c’
gcc.link bin.v2/libs/regex/build/gcc-mingw-4.4.4/debug/target-os-windows/has_icu.exe
/usr/lib/gcc/i586-mingw32msvc/4.4.4/../../../../i586-mingw32msvc/bin/ld: cannot find -licuuc
collect2: ld returned 1 exit status
"i586-mingw32msvc-g++" -L"/usr/bin" -L"/usr/lib" -Wl,-R -Wl,"/usr/bin" -Wl,-R -Wl,"/usr/lib" -Wl,-rpath-link -Wl,"/usr/bin" -Wl,-rpath-link -Wl,"/usr/lib" -o "bin.v2/libs/regex/build/gcc-mingw-4.4.4/debug/target-os-windows/has_icu.exe" -Wl,--start-group "bin.v2/libs/regex/build/gcc-mingw-4.4.4/debug/target-os-windows/has_icu_test.o" -Wl,-Bstatic -Wl,-Bdynamic -licuuc -licui18n -licudata -Wl,--end-group -g
...failed gcc.link bin.v2/libs/regex/build/gcc-mingw-4.4.4/debug/target-os-windows/has_icu.exe...
...failed updating 1 target...
...updated 8 targets...
Performing configuration checks
- has_icu builds : no
warning: Graph library does not contain MPI-based parallel components.
note: to enable them, add "using mpi ;" to your user-config.jam
...found 8 targets...
...updating 6 targets...
common.mkdir bin.v2/libs/math
common.mkdir bin.v2/libs/math/config
common.mkdir bin.v2/libs/math/config/gcc-mingw-4.4.4
common.mkdir bin.v2/libs/math/config/gcc-mingw-4.4.4/debug
common.mkdir bin.v2/libs/math/config/gcc-mingw-4.4.4/debug/target-os-windows
gcc.compile.c++ bin.v2/libs/math/config/gcc-mingw-4.4.4/debug/target-os-windows/has_gcc_visibility.o
cc1plus: warnings being treated as errors
libs/math/config/has_gcc_visibility.cpp: In function ‘int main()’:
libs/math/config/has_gcc_visibility.cpp:13: error: visibility attribute not supported in this configuration; ignored
"i586-mingw32msvc-g++" -ftemplate-depth-128 -O0 -fno-inline -Wall -g -Werror -fvisibility=hidden -DBOOST_ALL_NO_LIB=1 -I"." -c -o "bin.v2/libs/math/config/gcc-mingw-4.4.4/debug/target-os-windows/has_gcc_visibility.o" "libs/math/config/has_gcc_visibility.cpp"
...failed gcc.compile.c++ bin.v2/libs/math/config/gcc-mingw-4.4.4/debug/target-os-windows/has_gcc_visibility.o...
...failed updating 1 target...
...updated 5 targets...
- ../config//has_gcc_visibility builds : no
...found 46 targets...
...updating 1 target...
gcc.compile.c++ bin.v2/libs/math/config/gcc-mingw-4.4.4/debug/target-os-windows/has_long_double_support.o
...updated 1 target...
- ../config//has_long_double_support builds : yes
warning: skipping optional Message Passing Interface (MPI) library.
note: to enable MPI support, add "using mpi ;" to user-config.jam.
note: to suppress this message, pass "--without-mpi" to bjam.
note: otherwise, you can safely ignore this message.
************************************************************
Trying to build Boost.Thread with pthread support.
If you need pthread you should specify the paths.
You can specify them in site-config.jam, user-config.jam
or in the environment.
For example:
PTW32_INCLUDE=C:\Program Files\ptw32\Pre-built2\include
PTW32_LIB=C:\Program Files\ptw32\Pre-built2\lib
************************************************************
/home/francis/orig/boost_1_46_1/tools/build/v2/build/virtual-target.jam:1079: in virtual-target.register-actual-name from module virtual-target
error: Duplicate name of actual target: <pstage/lib>libboost_date_time.a
error: previous virtual target { common%common.copy-libboost_date_time.a.STATIC_LIB { gcc%gcc.archive-libboost_date_time.a.STATIC_LIB { gcc%gcc.compile.c++-gregorian/greg_month.o.OBJ { gregorian/greg_month.cpp.CPP } } { gcc%gcc.compile.c++-gregorian/greg_weekday.o.OBJ { gregorian/greg_weekday.cpp.CPP } } { gcc%gcc.compile.c++-gregorian/date_generators.o.OBJ { gregorian/date_generators.cpp.CPP } } } }
error: created from ./stage-proper
error: another virtual target { common%common.copy-libboost_date_time.a.STATIC_LIB { gcc%gcc.archive-libboost_date_time.a.STATIC_LIB { gcc%gcc.compile.c++-gregorian/greg_month.o.OBJ { gregorian/greg_month.cpp.CPP } } { gcc%gcc.compile.c++-gregorian/greg_weekday.o.OBJ { gregorian/greg_weekday.cpp.CPP } } { gcc%gcc.compile.c++-gregorian/date_generators.o.OBJ { gregorian/date_generators.cpp.CPP } } } }
error: created from ./stage-proper
error: added properties: <debug-symbols>off <define>NDEBUG <inlining>full <optimization>speed <runtime-debugging>off <variant>release
error: removed properties: <debug-symbols>on <inlining>off <optimization>off <runtime-debugging>on <variant>debug
/home/francis/orig/boost_1_46_1/tools/build/v2/build/virtual-target.jam:490: in actualize-no-scanner from module object(file-target)@3884
/home/francis/orig/boost_1_46_1/tools/build/v2/build/virtual-target.jam:135: in object(file-target)@3884.actualize from module object(file-target)@3884
/home/francis/orig/boost_1_46_1/tools/build/v2/build-system.jam:748: in load from module build-system
/home/francis/orig/boost_1_46_1/tools/build/v2/kernel/modules.jam:283: in import from module modules
/home/francis/orig/boost_1_46_1/tools/build/v2/kernel/bootstrap.jam:142: in boost-build from module
/home/francis/orig/boost_1_46_1/boost-build.jam:17: in module scope from module
Il dit libicu n'est pas trouvé sur mon système, mais en fonction de Paquet Synaptic Gérer, j'ai l' libicu-dev
paquet installé.
Je ne suis pas sûr de la façon de faire les choses. Quelqu'un peut-il aider?
Mise à jour de 1
Suivant @Luc recoommendation j'ai maintenant gcc-mingw
d'outils. Alors maintenant, mon les instructions ressembler à ceci:
tar xvf boost_1_46_1.tar.gz
cd boost_1_46_1/
echo "using gcc : 4.4.4: i586-mingw32msvc-g++ ;" > user-config.jam
./bootstrap.sh
./bjam toolset=gcc-mingw target-os=windows
Qui conduit à des erreurs suivantes:
error: toolset gcc initialization:
error: version 'mingw' requested but 'g++-mingw' not found and version '4.4.5' of default 'g++' does not match
error: initialized from
/home/francis/orig/boost-mingw/boost_1_46_1/tools/build/v2/build/toolset.jam:38: in toolset.using from module toolset
/home/francis/orig/boost-mingw/boost_1_46_1/tools/build/v2/build-system.jam:481: in process-explicit-toolset-requests from module build-system
/home/francis/orig/boost-mingw/boost_1_46_1/tools/build/v2/build-system.jam:561: in load from module build-system
/home/francis/orig/boost-mingw/boost_1_46_1/tools/build/v2/kernel/modules.jam:283: in import from module modules
/home/francis/orig/boost-mingw/boost_1_46_1/tools/build/v2/kernel/bootstrap.jam:142: in boost-build from module
/home/francis/orig/boost-mingw/boost_1_46_1/boost-build.jam:17: in module scope from module
Mise à jour 2
J'ai aussi essayé en précisant gcc-mingw
dans le user-config.jam
fichier. Alors mes instructions ressembler à ceci:
tar xvf boost_1_46_1.tar.gz
cd boost_1_46_1/
echo "using gcc-mingw : 4.4.4: i586-mingw32msvc-g++ ;" > user-config.jam
./bootstrap.sh
./bjam toolset=gcc-mingw target-os=windows
Ce qui conduit à:
error: version 'mingw' requested but 'g++-mingw' not found and version '4.4.5' of default 'g++' does not match
Mise à jour 3
Précisant g++-mingw
dans le user-config.jam
fichier:
using g++-mingw : 4.4.4: i586-mingw32msvc-g++ ;
...conduit à la même erreur.
- Est le chemin d'accès à i586-mingw32msvc-g++ en place correctement? Vous pouvez spécifier un chemin d'accès complet vers la g++ binaire. Ce qui se passe quand vous tapez juste
i586-mingw32msvc-g++
à la console à partir de votre répertoire? Vous aussi n'avez pas besoin probablement de la version 4.4.4. Je pense que vous ne devez utiliser cette syntaxe si vous essayez de configurer plusieurs versions. Vous avez peut être source de confusion là aussi. Donc, essayezgcc : : <your g++ binary path> ;
Vous devez vous connecter pour publier un commentaire.
J'ai eu des messages d'erreur similaires. Finalement, j'ai été en mesure de le compiler en utilisant exactement les commandes suivantes:
Je crois que votre problème est que vous ne spécifiez pas le "--user-config=utilisateur-config.confiture de paramètre". Le prochain problème que j'ai rencontré, c'est qu'il y aura un conflit de nom, à moins que je spécifier debug ou release build (--layout=marquées ou --layout=versionnées pourrait fonctionner aussi).
user-config.jam
fichier que tout le monde a parlé. N'a pris la peine de mentionner qu'il a besoin de--user-config
de travail.C'est la commande que j'utilise. J'ai testé pour stimuler 1.46 et 1,49.
Pour commencer, créer des liens pour le compilateur, dans /usr/i686-w64-mingw32/bin. Vous pouvez exécuter ce script :
Ensuite, installez bjam. Sur ubuntu /debian, il est inclus dans le package "libboost1.48-dev"
Pour finir, devenez root et exécuter
Fait !
g++-mingw
.J'ai eu un peu de difficulté avec cela aussi, mais il semble fonctionner pour moi maintenant. Pour être clair, je suis de la croix de la compilation sous Linux pour Windows.
de l'utilisateur-config.jam:
Noter que le deuxième terme de "mingw32" est arbitraire, "version" de la balise. La boîte à outils du pavillon combine le compilateur nom et le nom de la version w/un tableau de bord. Donc, dans mon cas, gcc-mingw32. Le troisième terme est ce qui est appelé ("i686-w64-mingw32-g++"). Bien évidemment votre version de mingw du compilateur peut avoir un nom différent.
Voici comment j'ai invoqué bjam:
J'ai eu un tas de drapeaux de Congelli501 de réponse. Mais ne vous embêtez pas avec le répertoire de liens approche.
Selon cette il semble que vous devriez être en utilisant la
toolset=gcc-mingw
. Vous aveztoolset=gcc
.Comme Luke déjà mentionné,
toolset=gcc-mingw
va certainement aider.Votre
libicu-dev
est sûr à 99% que le linux les en-têtes de la bibliothèque, ce qui n'est pas pour mingw. Vous devrez vous créer vous-même, ou l'obtenir à partir de quelque part (peut-être votre distribution, sinon, vous aurez besoin de compiler depuis les sources)toolset=gcc-mingw
ne semble pas fonctionner. Jetez un oeil à mon montage.J'ai eu le même problème. Essayez de spécifier qu'un seul build variante (c'est à dire, ajouter "variante=Libération lien=partagée à l'exécution lien=partagée")