Cross-compiling for Windows: Difference between revisions
(115 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
== Ubuntu, wine | == Ubuntu, wine and Microsoft Visual C++ == | ||
=== General setup === | |||
It seems that an Office extension for Windows must be compiled with MSVC to be compatible. Here is a way to do this from within Ubuntu. Make sure you have a recent wine installed. By default this will be a 64 bit version. If you need a 32-bit wine, use <code>winearch='win32' winecfg</code>. | |||
=== | ==== Visual Studio 2017 or 2019 (64 bit compiler, outputting 32 bit or 64 bit code) ==== | ||
* Get a working Visual Studio installation under Windows (the community version is available for free, and works fine) | |||
* Set up the following file structure in your <code>.wine/drive_c</code> directory (for 32 bit wine, change <code>Hostx64</code> to <code>Hostx86</code> in the first two lines). | |||
vc/bin/x64 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\bin\Hostx64\x64 | |||
vc/bin/x86 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\bin\Hostx64\x86 | |||
vc/lib/x64 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\lib\x64 | |||
vc/lib/x86 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\lib\x86 | |||
vc/include from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\include | |||
vc/sdk/lib/ucrt/x64 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64 | |||
vc/sdk/lib/ucrt/x86 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x86 | |||
vc/sdk/lib/um/x64 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x64 | |||
vc/sdk/lib/um/x86 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x86 | |||
vc/sdk/include/ucrt from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt | |||
vc/sdk/include/um from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\um | |||
vc/sdk/include/shared from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\shared | |||
vc/sdk/include/ucrt/sys/time.h: link to ../time.h | |||
* If you change this structure you must also adapt the .configure calls later | |||
* If you are only targeting x64 or x86 you can omit the other architecture | |||
* Run <code>wine regedit</code> and add to HKEY_CURRENT_USER\Environment the entry PATH: | |||
** 64 bit host, 64 bit target: <code>C:\vc\bin\x64</code> | |||
** 64 bit host, 32 bit target: <code>C:\vc\bin\x86;C:\vc\bin\x64</code> | |||
<code>wine cl</code>, <code>wine link</code> and <code>wine lib</code> should now work. | |||
==== Debug build ==== | |||
* | * To get a debug build, use the flags <code>-MDd -D_DEBUG</code> for libraries | ||
* | * You will need to copy the debug versions of the standard libraries into the paths | ||
=== Compiling CLN === | |||
You must use a recent [https://www.ginac.de/CLN/ CLN] (>1.3.6) | |||
If the linker reports undefined symbols, try to remove the inlined methods <code>cl_string::cl_string (const char * s)</code> and <code>cl_string& cl_string::operator= (const char * s)</code> from <code>include/cln/string.h</code> and instead defining them in <code>src/base/string/cl_st_make2.cc</code>. The extern definitions can be removed from these two methods. | |||
= | If compilation fails on the two assembler files, remove the following lines from <code>src/Makefile.am</code>: | ||
nodist_libcln_la_SOURCES = \ | |||
base/digitseq/cl_asm.S \ | |||
polynomial/elem/cl_asm_GF2.S | |||
==== Visual Studio 2017 and 2019 ==== | |||
* Run <code>./configure CC="wine cl" CXX="wine cl" CCAS="wine cl" LD="wine link" | * Run <code>autoreconf -i</code> | ||
* Configure the build | |||
** 64 bit build: <code>./configure CC="wine cl" CXX="wine cl" CCAS="wine cl" LD="wine link" LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/vc/sdk/include/shared" --host=amd64-mingw64msvc</code> | |||
** 32 bit build: <code>./configure CC="wine cl" CXX="wine cl" CCAS="wine cl" LD="wine link" LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/vc/sdk/include/shared" --host=i586-mingw32msvc</code> | |||
* Edit libtool and find the two lines containing <code>-OUT</code>. Replace <code>lib</code> with <code>wine lib</code> | * Edit libtool and find the two lines containing <code>-OUT</code>. Replace <code>lib</code> with <code>wine lib</code> | ||
* | * Make one of these changes (depending on what source version you have only one is possible) | ||
** Edit the src/Makefile and find the line starting with <code>.S.lo</code> and add the switch <code>-TC</code> before <code>-c -o</code> | |||
** | ** Remove the definition of <code>nodist_libcln_la_SOURCES</code> from src/Makefile.am (total three lines) and re-run configure | ||
* Build | |||
** 64 bit build: <code>make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64"</code> | |||
** | ** 32 bit build: <code>make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86"</code> | ||
** | * Check | ||
* | ** 64 bit build: <code>make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" check</code> | ||
* | ** 32 bit build: <code>make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" check</code> | ||
* All tests should pass successfully (note that on a 64-bit wine, the 32-bit tests will not execute). If they do not, you might need to install the package wine-binfmt | |||
=== Compiling GiNaC === | === Compiling GiNaC === | ||
For a 64 bit build, you need a recent version of [https://www.ginac.de GiNaC] (>1.7.8). | |||
If compilation fails with reference to a missing C++20 compiler, edit the <code>configure.ac</code> and change the compiler prerequisite <code>AX_CXX_COMPILE_STDCXX</code> to version 20. | |||
==== Visual Studio 2017 and 2019 ==== | |||
* | * Copy src/.libs/libcln.lib into ~/.wine/drive_c/local/lib/x64 (or x86) and the CLN headers in the include directory into ~/.wine/drive_c/local/include/x64/cln (or x86/cln) | ||
* | * Get a recent GiNaC (>= 1.8.2) | ||
* | * Run <code>autoreconf -i</code> in the source directory | ||
* | * Configure | ||
* | ** 64 bit: <code>./configure CC="wine cl" CXX="wine cl" LD="wine link" CLN_CFLAGS=-IC:/local/include/x64 CLN_LIBS=C:/local/lib/x64/libcln.lib LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" CPPFLAGS="-MD -EHsc -Zc:__cplusplus -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/local/include" --disable-shared --enable-static --host=amd64-mingw64msvc</code> | ||
* | ** 32 bit: <code>./configure CC="wine cl" CXX="wine cl" LD="wine link" CLN_CFLAGS=-IC:/local/include/x86 CLN_LIBS=C:/local/lib/x86/libcln.lib LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" CPPFLAGS="-MD -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/local/include" --disable-shared --enable-static --host=i586-mingw32msvc</code> | ||
* Edit the libtool created by configure: | |||
** The line starting with <code>old_archive_cmds</code> must read <code>"wine lib -OUT:\$oldlib\$oldobjs\$old_deplibs"</code>. Note that this line occurs twice in the file! | |||
* Build | |||
** 64 bit: <code>make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64"</code> | |||
** 32 bit: <code>make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86"</code> | |||
* On Windows compilation will fail in the ginsh subdirectory. Simply cd to this directory and run <code>make -t</code> (since we won't be needing ginsh) | |||
* Change to the toplevel directory again and finish the build with the same make command as before | |||
* Check | |||
** 64 bit: <code>make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" check</code> | |||
** 32 bit: <code>make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" check</code> | |||
* All tests should pass successfully (note that on 64 bit wine the 32 bit tests will not execute) | |||
=== Preparing the Office SDK === | === Preparing the Office SDK === | ||
* Install | * Install Office and the Office SDK into wine using the standard Windows installation files. Try to run ~/.wine/drive_c/Program Files/<YOUR_OFFICE>/program/soffice.exe, if this doesn't start, then install it into a clean wine. | ||
* | * Remember to install 64-bit versions of the Office and SDK if you set up a 64-bit Visual C++ environment | ||
* In the SDK base directory (e.g. ~/.wine/drive_c/Program Files/ | * In the SDK base directory (e.g. ~/.wine/drive_c/Program Files/<YOUR_OFFICE>/sdk), edit settings/dk.mk and change the platform <code>PLATFORM=wine</code> (for Apache OpenOffice, create a file called config.guess in the sdk subdirectory with contents <code>echo wine; exit 0</code>) | ||
* Edit settings/settings.mk and add a section for wine | * Edit settings/settings.mk and add a section for wine. The iMath source subdirectory src/wine-sdk-config contains a sample that works for me, but keep in mind that the settings.mk file varies between SDK versions. | ||
* Go to sdk/bin and create an executable called cppumaker with content <code>wine "$OO_SDK_HOME/bin/cppumaker.exe" "$@"</code> | |||
* Install the Office DLLs where wine can find them (e.g. symlink into the sdk/bin directory) but not into ~/.wine/drive_c/windows/system32, because this will confuse the office. This is required for cppumaker.exe to run | |||
* Go to sdk/bin and create an executable called cppumaker <code> | |||
* Install the Office DLLs where wine can find them | |||
=== Compiling iMath === | === Compiling iMath === | ||
Copy libginac.lib into ~/.wine/drive_c/local/lib/x64 (or x86) and the GiNaC headers (also from the parser subdirectory) into ~/.wine/drive_c/local/include/x64/ginac (or x86/ginac) | |||
* | * Because GNU make has problems with spaces in paths, it is strongly advisable to create a symlink to ~/.wine/drive_c/Program\ Files and any other directory that has spaces (e.g. LibreOffice\ 5) | ||
* Edit the config.wine file matching your Office installation in the directory src/wine-sdk-config. Set <code>BASE=</code> to match your wine installation directory. Edit the relevant entries at the top of the file using the symlinked directory names without spaces | |||
* Source | * Source this config.wine.xxx file | ||
* Run <code>autoreconf -i</code> | * Run <code>autoreconf -i</code> | ||
* Run <code>./configure CC="wine cl" CXX="wine cl" LD="wine cl | * 32 bit build: Run <code>./configure CC="wine cl" CXX="wine cl" LD="wine cl" --host=i586-mingw32msvc</code> | ||
* 64 bit build: Run <code>./configure CC="wine cl" CXX="wine cl" LD="wine cl" --host=amd64-mingw64msvc</code> | |||
* Change into the source directory | * Change into the source directory | ||
* Run make. This will produce an error about mt.exe at the end of the process. Just run make again and the extension is created in the iMathout directory | * Run make. This will produce an error about mt.exe at the end of the process. Just run make again and the extension is created in the iMathout directory |
Latest revision as of 17:56, 24 September 2023
Ubuntu, wine and Microsoft Visual C++
General setup
It seems that an Office extension for Windows must be compiled with MSVC to be compatible. Here is a way to do this from within Ubuntu. Make sure you have a recent wine installed. By default this will be a 64 bit version. If you need a 32-bit wine, use winearch='win32' winecfg
.
Visual Studio 2017 or 2019 (64 bit compiler, outputting 32 bit or 64 bit code)
- Get a working Visual Studio installation under Windows (the community version is available for free, and works fine)
- Set up the following file structure in your
.wine/drive_c
directory (for 32 bit wine, changeHostx64
toHostx86
in the first two lines).
vc/bin/x64 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\bin\Hostx64\x64 vc/bin/x86 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\bin\Hostx64\x86 vc/lib/x64 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\lib\x64 vc/lib/x86 from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\lib\x86 vc/include from C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\XX.YY.ZZZZZ\include vc/sdk/lib/ucrt/x64 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x64 vc/sdk/lib/ucrt/x86 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\ucrt\x86 vc/sdk/lib/um/x64 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x64 vc/sdk/lib/um/x86 from C:\Program Files (x86)\Windows Kits\10\Lib\10.0.16299.0\um\x86 vc/sdk/include/ucrt from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\ucrt vc/sdk/include/um from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\um vc/sdk/include/shared from C:\Program Files (x86)\Windows Kits\10\Include\10.0.16299.0\shared vc/sdk/include/ucrt/sys/time.h: link to ../time.h
- If you change this structure you must also adapt the .configure calls later
- If you are only targeting x64 or x86 you can omit the other architecture
- Run
wine regedit
and add to HKEY_CURRENT_USER\Environment the entry PATH:- 64 bit host, 64 bit target:
C:\vc\bin\x64
- 64 bit host, 32 bit target:
C:\vc\bin\x86;C:\vc\bin\x64
- 64 bit host, 64 bit target:
wine cl
, wine link
and wine lib
should now work.
Debug build
- To get a debug build, use the flags
-MDd -D_DEBUG
for libraries - You will need to copy the debug versions of the standard libraries into the paths
Compiling CLN
You must use a recent CLN (>1.3.6)
If the linker reports undefined symbols, try to remove the inlined methods cl_string::cl_string (const char * s)
and cl_string& cl_string::operator= (const char * s)
from include/cln/string.h
and instead defining them in src/base/string/cl_st_make2.cc
. The extern definitions can be removed from these two methods.
If compilation fails on the two assembler files, remove the following lines from src/Makefile.am
:
nodist_libcln_la_SOURCES = \ base/digitseq/cl_asm.S \ polynomial/elem/cl_asm_GF2.S
Visual Studio 2017 and 2019
- Run
autoreconf -i
- Configure the build
- 64 bit build:
./configure CC="wine cl" CXX="wine cl" CCAS="wine cl" LD="wine link" LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/vc/sdk/include/shared" --host=amd64-mingw64msvc
- 32 bit build:
./configure CC="wine cl" CXX="wine cl" CCAS="wine cl" LD="wine link" LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" CPPFLAGS="-MD -DNO_ASM -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/vc/sdk/include/shared" --host=i586-mingw32msvc
- 64 bit build:
- Edit libtool and find the two lines containing
-OUT
. Replacelib
withwine lib
- Make one of these changes (depending on what source version you have only one is possible)
- Edit the src/Makefile and find the line starting with
.S.lo
and add the switch-TC
before-c -o
- Remove the definition of
nodist_libcln_la_SOURCES
from src/Makefile.am (total three lines) and re-run configure
- Edit the src/Makefile and find the line starting with
- Build
- 64 bit build:
make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64"
- 32 bit build:
make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86"
- 64 bit build:
- Check
- 64 bit build:
make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" check
- 32 bit build:
make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" check
- 64 bit build:
- All tests should pass successfully (note that on a 64-bit wine, the 32-bit tests will not execute). If they do not, you might need to install the package wine-binfmt
Compiling GiNaC
For a 64 bit build, you need a recent version of GiNaC (>1.7.8).
If compilation fails with reference to a missing C++20 compiler, edit the configure.ac
and change the compiler prerequisite AX_CXX_COMPILE_STDCXX
to version 20.
Visual Studio 2017 and 2019
- Copy src/.libs/libcln.lib into ~/.wine/drive_c/local/lib/x64 (or x86) and the CLN headers in the include directory into ~/.wine/drive_c/local/include/x64/cln (or x86/cln)
- Get a recent GiNaC (>= 1.8.2)
- Run
autoreconf -i
in the source directory - Configure
- 64 bit:
./configure CC="wine cl" CXX="wine cl" LD="wine link" CLN_CFLAGS=-IC:/local/include/x64 CLN_LIBS=C:/local/lib/x64/libcln.lib LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" CPPFLAGS="-MD -EHsc -Zc:__cplusplus -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/local/include" --disable-shared --enable-static --host=amd64-mingw64msvc
- 32 bit:
./configure CC="wine cl" CXX="wine cl" LD="wine link" CLN_CFLAGS=-IC:/local/include/x86 CLN_LIBS=C:/local/lib/x86/libcln.lib LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" CPPFLAGS="-MD -EHsc -IC:/vc/include -IC:/vc/sdk/include/um -IC:/vc/sdk/include/ucrt -IC:/local/include" --disable-shared --enable-static --host=i586-mingw32msvc
- 64 bit:
- Edit the libtool created by configure:
- The line starting with
old_archive_cmds
must read"wine lib -OUT:\$oldlib\$oldobjs\$old_deplibs"
. Note that this line occurs twice in the file!
- The line starting with
- Build
- 64 bit:
make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64"
- 32 bit:
make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86"
- 64 bit:
- On Windows compilation will fail in the ginsh subdirectory. Simply cd to this directory and run
make -t
(since we won't be needing ginsh) - Change to the toplevel directory again and finish the build with the same make command as before
- Check
- 64 bit:
make LIB="C:/vc/lib/x64;C:/vc/sdk/lib/um/x64;C:/vc/sdk/lib/ucrt/x64" check
- 32 bit:
make LIB="C:/vc/lib/x86;C:/vc/sdk/lib/um/x86;C:/vc/sdk/lib/ucrt/x86" check
- 64 bit:
- All tests should pass successfully (note that on 64 bit wine the 32 bit tests will not execute)
Preparing the Office SDK
- Install Office and the Office SDK into wine using the standard Windows installation files. Try to run ~/.wine/drive_c/Program Files/<YOUR_OFFICE>/program/soffice.exe, if this doesn't start, then install it into a clean wine.
- Remember to install 64-bit versions of the Office and SDK if you set up a 64-bit Visual C++ environment
- In the SDK base directory (e.g. ~/.wine/drive_c/Program Files/<YOUR_OFFICE>/sdk), edit settings/dk.mk and change the platform
PLATFORM=wine
(for Apache OpenOffice, create a file called config.guess in the sdk subdirectory with contentsecho wine; exit 0
) - Edit settings/settings.mk and add a section for wine. The iMath source subdirectory src/wine-sdk-config contains a sample that works for me, but keep in mind that the settings.mk file varies between SDK versions.
- Go to sdk/bin and create an executable called cppumaker with content
wine "$OO_SDK_HOME/bin/cppumaker.exe" "$@"
- Install the Office DLLs where wine can find them (e.g. symlink into the sdk/bin directory) but not into ~/.wine/drive_c/windows/system32, because this will confuse the office. This is required for cppumaker.exe to run
Compiling iMath
Copy libginac.lib into ~/.wine/drive_c/local/lib/x64 (or x86) and the GiNaC headers (also from the parser subdirectory) into ~/.wine/drive_c/local/include/x64/ginac (or x86/ginac)
- Because GNU make has problems with spaces in paths, it is strongly advisable to create a symlink to ~/.wine/drive_c/Program\ Files and any other directory that has spaces (e.g. LibreOffice\ 5)
- Edit the config.wine file matching your Office installation in the directory src/wine-sdk-config. Set
BASE=
to match your wine installation directory. Edit the relevant entries at the top of the file using the symlinked directory names without spaces - Source this config.wine.xxx file
- Run
autoreconf -i
- 32 bit build: Run
./configure CC="wine cl" CXX="wine cl" LD="wine cl" --host=i586-mingw32msvc
- 64 bit build: Run
./configure CC="wine cl" CXX="wine cl" LD="wine cl" --host=amd64-mingw64msvc
- Change into the source directory
- Run make. This will produce an error about mt.exe at the end of the process. Just run make again and the extension is created in the iMathout directory