1

我使用 clang 而不是 gcc 编译了一个 GTK+ 程序。到目前为止一切顺利,除了我无法正确链接ld

调用 gcc 的原始 makefile 进行链接,如下所示:

gcc -g -O2 -export-dynamic -o my_application somefile.o another.o -pthread -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnomevfs-2 -lgnomecanvas-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-激活 -lORBit-2 -lart_lgpl_2 -lgconf-2 -lglade-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -lxml2 -pthread -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lrt -lglib-2.0

如果我在上面的命令中简单地用clang替换gcc,我会从后者那里得到这个警告:

叮当声:警告:编译期间未使用的参数:'-e xport-dynamic'

问题是:clang 不将“-export-dynamic”识别为链接器选项,因此它不会将其传递给ld。这会导致对外部函数的引用被废弃:执行最终二进制文件时,菜单选项和按钮都没有反应。

如果我使用 gcc 进行最后的链接步骤,则二进制文件可以完美运行(即使它确实是用 clang 编译的,而 gcc 只进行链接)。由于我试图在我的机器中用 clang 完全替换 gcc,这是不可接受的。

所以我尝试了这个:

ld /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o -g -O2 -export-dynamic my_application somefile.o another.o -o -lgnomeui-2 -lSM -lICE -lbonoboui-2 -lgnomevfs-2 -lgnomecanvas-2 -lgnome-2 -lpopt -lbonobo-2 -lbonobo-activation -lORBit-2 -lart_lgpl_2 -lgconf-2 -lglade-2.0 -lgtk-x11-2.0 -lgdk-x11 -2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -lxml2 -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lrt -lglib-2.0

通过添加前 3 个对象,我避免了“找不到 _start”消息。但是后来我收到了上述两个抱怨:

/usr/lib/crt1.o: 在函数中_start: (.text+0x12): 未定义的引用__libc_csu_fini /usr/lib/crt1.o: 在函数中_start: (.text+0x19): 未定义的引用__libc_csu_init

我尝试在列表中添加 crtbegin.o 和 crtend.o ,甚至在 crt1.o 之前但无济于事。链接器的正确调用是什么?

(编辑后):如果没有其他方法,有没有办法在使用gcc进行链接时捕获gcc传递给ld的确切参数?

4

2 回答 2

2

gcc自动将语言支持库和对象添加到您提供的链接列表中。如果您想直接调用,您必须自己添加它们ld。举个例子man ld,它可能是

ld -o <output> /lib/crt0.o hello.o -lc

尝试添加-lc,您需要的符号应该在其中(至少在我的系统上是这样)。

于 2012-04-23T12:38:50.173 回答
1

您可以使用-Wl,-export-dynamicto 传递-export-dynamic给 ld 而无需铿锵知道它。

于 2012-04-24T13:11:19.423 回答