Cross-compiling for Windows on Linux

I am trying to create mingw files for enhancement on a Linux machine. The mingw compiler is present on my system as / usr / bin / i 586-mingw32msvc-g ++, and I was able to create a simple HelloWorld.exe application.

Here is the exact list of my 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 

The result is the following:

 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 

He says libicu was not found on my system, but according to the Synaptic Package Manage, I have the libicu-dev package installed.

I'm not sure how to fix it. Can anyone help?

Update 1

Following @Luke's recommendations, I am now gcc-mingw toolset. So, now my assembly instructions look like this:

 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 

This leads to the following errors:

 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 

Update 2

I also tried specifying gcc-mingw in the user-config.jam . Then my assembly instructions look like this:

 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 

That leads to:

 error: version 'mingw' requested but 'g++-mingw' not found and version '4.4.5' of default 'g++' does not match 

Update 3

The g++-mingw user-config.jam g++-mingw in the user-config.jam :

 using g++-mingw : 4.4.4: i586-mingw32msvc-g++ ; 

... leads to the same error.

+7
source share
6 answers

I got similar error messages. In the end, I was able to compile it using the following commands:

 $ echo "using gcc : : i686-w64-mingw32-g++ ;" > user-config.jam $ ./bootstrap.sh $ ./b2 --user-config=user-config.jam toolset=gcc-mingw target-os=windows release 

I believe your problem is that you are not specifying the parameter "--user-config = user-config.jam". The next problem I ran into was that a name conflict would occur if I didn't specify either debugging or release build (--layout = tagged or --layout = versioned might work too).

+11
source

These are the commands that I use. I tested them to increase 1.46 and 1.49.

To get started, create links to the compiler inside / usr / i 686-w64-mingw32 / bin. You can run this script:

 #!/bin/bash binDir="/usr/bin" destDir="/usr/i686-w64-mingw32/bin" cd "$binDir" mkdir -p "$destDir" for name in $(ls i686-w64-mingw32*); do newName=$(echo "$name" | sed -e "s/i686-w64-mingw32-\(.\?\)/\1/") if [ -f "$destDir/$newName" ]; then rm "$destDir/$newName" fi ln -s "$binDir/$name" "$destDir/$newName" done 

Then install bjam. On ubuntu / debian it is included in the package "libboost1.48-dev"

 apt-get install libboost1.48-dev 

To finish, become root and run

 env PATH=/usr/i686-w64-mingw32/bin:$PATH bjam toolset=gcc target-os=windows variant=release threading=multi threadapi=win32 link=static --prefix=/usr/i686-w64-mingw32 -j 4 --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged install 

Done!

+3
source

I also had difficulties with this, but now it works for me. To be clear, I cross-compile on Linux for Windows.

in user-config.jam:

 using gcc : mingw32 : i686-w64-mingw32-g++ ; 

Note that the second term "mingw32" is an arbitrary version tag. The toolbox flag combines the compiler name and the version name with a dash. So, in my case, gcc-mingw32. The third term is what is actually being called ("i686-w64-mingw32-g ++"). Obviously, your version of the mingw compiler may have a different name.

This is how I called bjam:

 ./b2 toolset=gcc-mingw32 target-os=windows threadapi=win32 --build-type=complete --prefix=/usr/x86_64-w64-mingw32/local --layout=tagged --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 

I got all the interesting flags from Congelli501 answer. But did not bother with the catalog of links.

+2
source

According to this , it looks like you should use toolset=gcc-mingw . You have toolset=gcc .

+1
source

As Luke already mentioned, toolset=gcc-mingw will certainly help.

Your libicu-dev is 99% sure that the headers of the Linux library are not designed for mingw. You will have to either build it yourself, or get it somewhere (maybe your distribution, otherwise you will need to create it from the source)

+1
source

I had the same problem. Try to specify only one build option (i.e. Add "option = Release link = shared runtime-link = shared")

+1
source

All Articles