64-bit compilation in Wine

Raikia raikiasec at gmail.com
Tue Dec 29 21:13:59 UTC 2020


On Tuesday, 29 December 2020 at 20:29:15 UTC, H. S. Teoh wrote:
> On Tue, Dec 29, 2020 at 07:39:14PM +0000, Raikia via 
> Digitalmars-d-learn wrote: [...]
>> So interestingly, I actually got this to work by running "sudo 
>> wine" instead of just "wine".  No idea why wine needs root 
>> access on the underlying system for wine to operate properly 
>> but ok...
>> 
>> Now I'm running into an issue of not having libcmt in Wine so 
>> it dynamically links to msvcrt instead (and thus requires a 
>> dll on deployment).  Have you come across this before?
>
> Haven't come across this myself, but I'd mention that if what 
> you're interested in is to cross-compile from Posix to Windows, 
> you should really consider using LDC instead, which has 
> cross-compilation built-in, and the Windows version comes 
> bundled with all the necessary libraries to compile and link a 
> runnable executable without needing to download additional 
> libraries (unless your own code uses additional libraries).
>
> Some time ago I wanted to compile a Linux app for Windows user, 
> so I tried using Wine with the Windows version of DMD.  It 
> worked, but it was klunky, and prone to breakages like the ones 
> you describe.  Eventually, I gave up and used LDC instead, and 
> it's been working very well.  Here's my setup:
>
> 1) Install LDC, Linux version. Let's say for illustration 
> purposes this is in /usr/local/ldc/linux.
>
> 2) Download and unpack LDC, Windows version. Let's say you put 
> this in /usr/local/ldc/windows.
>
> 3) Edit ldc2.conf for the Linux version (probably in 
> /usr/local/ldc/linux/etc/ldc2.conf), and add this block to the 
> bottom of the file, so that LDC will find the right Windows 
> libraries to link to:
>
> 	"(i686|x86_64)-.*-windows.msvc":
> 	{
> 	    switches = [
> 		"-defaultlib=phobos2-ldc,druntime-ldc",
> 		"-link-defaultlib-shared=false",
> 	    ];
> 	    lib-dirs = [
> 		"/usr/local/ldc/windows/lib",
> 	    ];
> 	};
>
> 4) Compile your program with:
>
> 	ldc2 -mtriple=x86_64-windows-msvc ... # rest of flags, files, 
> etc.
>
> This produces a Windows executable that you can run directly on 
> Windows (or even in Wine) without any additional hassles.
>
>
> T

Thanks for that!  That certainly helped, but when running the 
program on a fresh Windows install, I still get the error "The 
program can't start because vcruntime140.dll is missing from your 
computer".  In my (limited) experience, I think its because it is 
using msvcrt (which is dynamically linked) instead of libcmt 
(which is static).  If I try to specify libcmt like:

ldc2 -mscrtlib=libcmt -mtriple=x86_64-windows-msvc .\file.d

I get:


ldc2: /build/ldc-vElToV/ldc-1.24.0/driver/linker-msvc.cpp:40: 
void {anonymous}::addMscrtLibs(bool, 
std::vector<std::__cxx11::basic_string<char> >&): Assertion 
`mscrtlibName.contains_lower("vcruntime")' failed.
/lib/x86_64-linux-gnu/libLLVM-11.so.1(_ZN4llvm3sys15PrintStackTraceERNS_11raw_ostreamE+0x1f)[0x7f103b705e7f]
/lib/x86_64-linux-gnu/libLLVM-11.so.1(_ZN4llvm3sys17RunSignalHandlersEv+0x22)[0x7f103b7041b2]
/lib/x86_64-linux-gnu/libLLVM-11.so.1(+0xbd1355)[0x7f103b706355]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x14140)[0x7f103ab04140]
/lib/x86_64-linux-gnu/libc.so.6(gsignal+0x141)[0x7f103a639c41]
/lib/x86_64-linux-gnu/libc.so.6(abort+0x123)[0x7f103a623537]
/lib/x86_64-linux-gnu/libc.so.6(+0x2540f)[0x7f103a62340f]
/lib/x86_64-linux-gnu/libc.so.6(+0x345c2)[0x7f103a6325c2]
ldc2(_Z19linkObjToBinaryMSVCN4llvm9StringRefERKSt6vectorINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESaIS7_EE+0x2405)[0x55990ec775b5]
ldc2(_Z15linkObjToBinaryv+0x6b0)[0x55990ec6f710]
ldc2(_Z13mars_mainBodyR5ParamR5ArrayIPKcES5_+0x1719)[0x55990ea4b149]
ldc2(_Z7cppmainv+0x1c88)[0x55990ec7a6d8]
ldc2(_D2rt6dmain212_d_run_main2UAAamPUQgZiZ6runAllMFZv+0x4c)[0x55990edd811c]
ldc2(_d_run_main2+0x198)[0x55990edd7f38]
ldc2(_d_run_main+0x8e)[0x55990edd7d8e]
ldc2(main+0x22d)[0x55990e965c9d]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xea)[0x7f103a624cca]
ldc2(_start+0x2a)[0x55990e967e6a]
Aborted



More information about the Digitalmars-d-learn mailing list