On my Ubuntu Server, I can't link any D program which uses libraries other than Phobos.

Example:

//////////////////////////////
import std.net.curl;
import std.stdio;

void main()
{
    writeln(get("dlang.org"));
}
//////////////////////////////

dlang@k3:~/2015-01-25$ dmd -L-lcurl test.d
/usr/local/lib/x86_64-linux-gnu/libphobos2.a(curl.o): In function `_D3std3net4curl4HTTP19_sharedStaticCtor34FZv': /usr/local/src/phobos/std/net/curl.d:2503: undefined reference to `curl_version_info' /usr/local/lib/x86_64-linux-gnu/libphobos2.a(curl.o): In function `_D3std3net4curl4Curl19_sharedStaticCtor35FZv': /usr/local/src/phobos/std/net/curl.d:3497: undefined reference to `curl_global_init' /usr/local/lib/x86_64-linux-gnu/libphobos2.a(curl.o): In function `_D3std3net4curl4Curl19_sharedStaticDtor36FZv': /usr/local/src/phobos/std/net/curl.d:3503: undefined reference to `curl_global_cleanup'
[...]
collect2: error: ld returned 1 exit status
--- errorlevel 1


The library (.a and .so) is installed and DMD passes -lcurl to gcc.

This is what DMD runs:

gcc test.o -o test -m64 -lcurl -L/usr/local/lib/x86_64-linux-gnu -Xlinker --export-dynamic -l:libphobos2.a -lpthread -lm -lrt

I got the above program to build by editing /etc/dmd.conf and adding -L-l:libphobos2.a -L-lcurl to DFLAGS. However, this doesn't help when linking with other D libraries, e.g. when using Dub.

I believe this problem is documented here:

https://issues.dlang.org/show_bug.cgi?id=7044
https://issues.dlang.org/show_bug.cgi?id=12572

I don't see a workaround that would apply to dub, though.

Is there a fix or workaround? I think this can be fixed in Dub to make it pass the libraries in the correct order, but I don't normally use Dub so I'm not sure. I sort of need this to be able to work on dlang.org - some functionality is only provided by posix.mak, which doesn't work under Cygwin.

Reply via email to