gpt4 book ai didi

c - ld 提示 : in function "_start", undefined reference to "__libc_csu_fini"& "__libc_csu_init"

转载 作者:太空宇宙 更新时间:2023-11-04 02:13:50 24 4
gpt4 key购买 nike

我使用 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-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 -pthread -lgstreamer-0.10 -lgobject-2.0 -lgmodule-2.0 -lxml2 -lgthread-2.0 -lrt -lglib-2.0

如果我在上面的命令中简单地将 gcc 替换为 clang ,我会从后者收到此警告:

clang: warning: argument unused during compilation: '-e xport-dynamic'

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

如果我使用 gcc 执行最后的链接步骤,则二进制文件可以完美运行(即使它实际上是使用 clang 编译的,而 gcc 仅执行链接)。因为我试图在我的机器上用 clang 完全替换 gcc,所以这是 Not Acceptable 。

所以我尝试了这个:

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: In function _start: (.text+0x12): undefined reference to __libc_csu_fini /usr/lib/crt1.o: In function _start: (.text+0x19): undefined reference to __libc_csu_init

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

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

最佳答案

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

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

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

关于c - ld 提示 : in function "_start", undefined reference to "__libc_csu_fini"& "__libc_csu_init",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10280631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com