Linux中的std.net.curl链接器错误

时间:2012-04-10 19:28:00

标签: linux ubuntu ld d

我正在尝试使用DMD 2.058在32位Ubuntu Linux(11.10 Ocelot)上使用std.net.curl。

当我构建(dmd source.d)时,我得到:

/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl.o): In function `_D3std3net4curl4Curl19_sharedStaticCtor30FZv':
std/net/curl.d:(.text._D3std3net4curl4Curl19_sharedStaticCtor30FZv+0x6): undefined reference to `curl_global_init'
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl.o): In function `_D3std3net4curl4Curl19_sharedStaticDtor31FZv':
std/net/curl.d:(.text._D3std3net4curl4Curl19_sharedStaticDtor31FZv+0x4): undefined reference to `curl_global_cleanup'
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl_12fd_140.o): In function `_D3std3net4curl4HTTP4Impl6__dtorMFZv':
std/net/curl.d:(.text._D3std3net4curl4HTTP4Impl6__dtorMFZv+0x12): undefined reference to `curl_slist_free_all'
/usr/lib/gcc/i686-linux-gnu/4.6.1/../../../../lib/libphobos2.a(curl_12fd_140.o): In function `_D3std3net4curl4HTTP3dupMFZS3std3net4curl4HTTP':
std/net/curl.d:(.text._D3std3net4curl4HTTP3dupMFZS3std3net4curl4HTTP+0x53): undefined reference to `curl_slist_append'

[snip]

我将-L-lcurl添加到我的命令行(完整命令:dmd source.d -L-lcurl),但我得到了完全相同的结果。我安装了libcurl4-openssl。我可以在这台计算机上构建simple C curl程序而不会出现问题(gcc simple.c -lcurl)。我不知道从这里可以看到这一点。

更新:以下是根据dmd -v调用链接器的方式:

gcc source.o -o source -m32 -lcurl -Xlinker -L/usr/lib -Xlinker -L/usr/lib64 -Xlinker --no-warn-search-mismatch -Xlinker --export-dynamic -lphobos2 -lpthread -lm -lrt

4 个答案:

答案 0 :(得分:5)

正如您自己发现的那样,库的顺序是不正确的。引自“GCC简介”“调用另一个库中定义的外部函数的库应该出现在包含该函数的库之前。”在你的情况下{ {1}}调用外部库(libcurl)函数,因此我猜libphobos应该在libphobos之前调用。

这本书可在线获取。与OT相关的章节在这里:http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html

答案 1 :(得分:5)

在这方面,DMD编译器显然已被打破。我发布了一个补丁来修复它(可能不是最好的),但编译器的维护者并不相信这需要修复,因此没有太多关于它的讨论。

答案 2 :(得分:3)

似乎是修复phobos2 / curl链接器顺序问题的最简单方法,如本主题其他部分所述:

dmd source.d -L-lphobos2 -L-lcurl

对我来说就像是一种魅力。

答案 3 :(得分:0)

我想通过-v是否获得了链接器命令并对其进行了重新排序,以便-lcurl最终链接而没有问题。

gcc source.o -o source -m32 -Xlinker -L/usr/lib -Xlinker -L/usr/lib64 -Xlinker --no-warn-search-mismatch -Xlinker --export-dynamic -lphobos2 -lpthread -lm -lrt -lcurl

我仍然很好奇是否有办法解决这个问题,而无需手动运行链接器。