9

我正在尝试使用 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。我可以毫无问题地在这台计算机上构建一个简单的 C curlgcc 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

4 回答 4

5

正如您自己发现的那样,库的顺序不正确。引用“GCC 简介”中的一句话:“调用另一个库中定义的外部函数的库应该出现在包含该函数的库之前。” 在你的情况下libphobos调用外部库的(libcurl)函数,所以我想libphobos应该在libcurl.

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

于 2012-04-11T17:16:05.047 回答
5

DMD 编译器在这方面显然被破坏了。我发布了一个补丁来修复它(也许不是最好的),但编译器的维护者根本不相信这需要修复,所以没有太多关于它的讨论。

于 2012-06-30T10:27:37.700 回答
3

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

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

对我来说就像一个魅力。

于 2013-01-02T12:09:03.310 回答
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

我仍然很好奇是否有办法在不手动运行链接器的情况下解决这个问题。

于 2012-04-10T22:16:44.053 回答