www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Link errors with curl, libevent, OpenSSL

reply "Vladimir Panteleev" <vladimir thecybershadow.net> writes:
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.
Jan 24 2015
parent reply "AndyC" <andy squeakycode.net> writes:
On Sunday, 25 January 2015 at 05:48:26 UTC, Vladimir Panteleev 
wrote:
 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.
What weirdness has Ubuntu done that this doesn't work? I'm running Slackware and just tried your example and it works fine. Does Ubuntu have developer curl packages as well as regular curl packages? Maybe libcurl-dev package? -Andy
Jan 25 2015
parent reply "AndyC" <andy squeakycode.net> writes:
On Sunday, 25 January 2015 at 15:11:33 UTC, AndyC wrote:
 On Sunday, 25 January 2015 at 05:48:26 UTC, Vladimir Panteleev 
 wrote:
 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
What weirdness has Ubuntu done that this doesn't work? I'm running Slackware and just tried your example and it works fine. Does Ubuntu have developer curl packages as well as regular curl packages? Maybe libcurl-dev package? -Andy
Yep, Ubuntu bug: https://bugs.launchpad.net/ubuntu/+source/curl/+bug/1001576 -Andy
Jan 25 2015
parent "Vladimir Panteleev" <vladimir thecybershadow.net> writes:
On Sunday, 25 January 2015 at 15:23:03 UTC, AndyC wrote:
 On Sunday, 25 January 2015 at 15:11:33 UTC, AndyC wrote:
 On Sunday, 25 January 2015 at 05:48:26 UTC, Vladimir Panteleev 
 wrote:
 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
What weirdness has Ubuntu done that this doesn't work? I'm running Slackware and just tried your example and it works fine. Does Ubuntu have developer curl packages as well as regular curl packages? Maybe libcurl-dev package? -Andy
Yep, Ubuntu bug: https://bugs.launchpad.net/ubuntu/+source/curl/+bug/1001576
Thank you. It looks like this is an incompatibility between DMD and Ubuntu enabling --as-needed. This pointed me in the right direction to find a workaround: https://issues.dlang.org/show_bug.cgi?id=12572#c5
Jan 25 2015