Compiling an app to a single binary - possible?

Dicebot public at dicebot.lv
Fri Nov 15 07:47:34 PST 2013


On Friday, 15 November 2013 at 15:27:45 UTC, Jacek Furmankiewicz 
wrote:
> One of the nice features of Go is that when you compile an app, 
> it pulls in ALL the dependencies (i.e. the full SDK + all 
> libraries your app depends on) and generates a single binary 
> (around 2 MB for a Hello World app).
>
> This is extremely useful for deployment purposes, since it is 
> so straightforward to just copy the app to multiple servers 
> without having to worry if every one of them has all the 
> required dependencies installed / updated, etc.
>
> Does D offer something similar (maybe via some dmd switches)?
>
> For example, If I am creating a vibe.d app, would I need to 
> deploy the vibe.d libraries separately with my app on all the 
> servers in production?
>
> Thanks
> Jacek

Go provides only static linking. D provides both and it is up to 
developer to decide. Often it is simply a matter of what version 
of library is installed in the system - static or dynamic one.

You can use `ldd` on Linux to check dynamic dependencies for any 
given binary. On my Arch Linux installation output for simple 
vibe.d app looks like this:

$ ldd ./test
	linux-vdso.so.1 (0x00007fba8f53b000)
	libevent_pthreads-2.0.so.5 => 
/usr/lib/libevent_pthreads-2.0.so.5 (0x00007fba8f11b000)
	libevent-2.0.so.5 => /usr/lib/libevent-2.0.so.5 
(0x00007fba8eed3000)
	libssl.so.1.0.0 => /usr/lib/libssl.so.1.0.0 (0x00007fba8ec66000)
	libcrypto.so.1.0.0 => /usr/lib/libcrypto.so.1.0.0 
(0x00007fba8e85e000)
	libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fba8e640000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007fba8e33d000)
	librt.so.1 => /usr/lib/librt.so.1 (0x00007fba8e135000)
	libc.so.6 => /usr/lib/libc.so.6 (0x00007fba8dd8a000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fba8f31e000)
	libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fba8db86000)
	libz.so.1 => /usr/lib/libz.so.1 (0x00007fba8d970000)

List may differ between distros / operating systems.

Note that you can't "force" static linking if only shared 
libraries are present in the system and AFAIK Go does no magic 
here - it will simply fail to compile/link in such situation.

tl; dr: yes, if you use static versions of required libraries


More information about the Digitalmars-d-learn mailing list