我使用 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的确切参数?