C &引用;未定义符号“U memset”;
我问了一个类似的问题,但我有一些更新,这真的让我困惑。基本上,我想用链接器链接多个对象文件,如下所示:C &引用;未定义符号“U memset”;,c,linker,linker-errors,sparc,C,Linker,Linker Errors,Sparc,我问了一个类似的问题,但我有一些更新,这真的让我困惑。基本上,我想用链接器链接多个对象文件,如下所示: /usr/ccs/bin/ld -o q -e start_master -dn -z defs -M ../../../mapfile.q {list of object files} 我得到以下错误: Undefined first referenced symbol in file
/usr/ccs/bin/ld -o q -e start_master -dn -z defs -M ../../../mapfile.q {list of object files}
我得到以下错误:
Undefined first referenced
symbol in file
_memset reconf.o
有趣的是,reconf.c中没有引用memset,我也对整个目录进行了grep's,但在其他任何文件中也没有对_memset的引用。因此,我想知道为什么我从链接器中得到这个错误消息,尽管我的源代码中没有实际使用过memset。有人知道这里会发生什么吗
非常感谢,这个错误让我们精神错乱
编辑:
我尝试将路径添加到memset库,并将其与-lc链接,然后在详细模式下运行它:
/usr/ccs/bin/ld -o q -e start_master -dn -z defs -z verbose -L/usr/lib -M ../../../mapfile.q {list of object files} -lc
然后我得到以下错误:
ld:致命:库-找不到lc:未找到
ld:致命:文件处理错误。没有写入q的输出
虽然libc.so显然位于/usr/lib中,但是
混乱的
编辑二:
进行更多的研究后,Solaris 10上的静态链接似乎消失了,您可以在此处阅读:
也许这是我的问题。有人知道如何重写我的linker命令来解决这个问题吗
非常感谢 也许你做到了:
struct S v = { 0 };
或
或
一些编译器正在隐式地为这些东西添加内置的memset(或memcpy)。然后,内置的memset被称为_memset(在您的例子中)。链接后,如果您的libc(或在您的情况下提供标准函数的libc)没有提供链接,则会出现此链接错误。假设您在Solaris上,您会在
libc中找到memset。因此库:
/usr/lib-> nm libc.so | grep memset
[7122] | 201876| 104|FUNC |GLOB |0 |9 |_memset
只需将-lc
添加到命令行Memset是标准C库中的库函数。如果不使用gcc进行链接(默认情况下,gcc会将文件链接到标准库),则应将程序显式链接到libc
在另一个选项中,可能不使用libc。在这种情况下,memset调用可以由gcc生成
从man gcc
:
-nodefaultlibs
链接时不要使用标准系统库。只有您指定的库将被传递到链接器,指定系统库链接的选项(如-static libgcc或-shared libgcc)将被忽略。通常使用标准启动文件,除非使用-nostartfiles编译器可能会生成对memcmp、memset、memcpy和memmove的调用。这些条目通常由libc中的条目解析。指定此选项时,应通过其他机制提供这些入口点。
在这种情况下,只需编写memset(这是一个简单的过程)并将其提供给链接器。使用gcc
(或者在您的情况下使用cc
),而不是直接尝试驱动ld
。不幸的是,这给了我以下错误:段地址或长度“v0xfff0000000”超过内部限制如果链接多个.o
文件以创建新的.o
文件,则未定义的符号不应是错误。在我看来,ld
正在尝试制作一个可执行文件…这并没有真正回答问题-OP想知道如何修复错误,即需要链接哪些特定的附加库。我回答说:“有人知道这里会发生什么吗?”谢谢你的回答,libc似乎在系统上,因此,当运行您的命令时,我将获得000310d4 T_memset。我试图将-lc标志提供给链接器,但结果有点“令人惊讶”:ld:fatal:library-lc:notfound您还必须告诉它在哪里可以找到它。将-L/usr/lib
添加到链接器选项将此添加到命令行,错误保持不变。这里发生的事情真让人困惑…@迈克,你能用你现在使用的确切命令行更新你的问题吗?嗨,马特,刚刚用我现在使用的确切命令行更新了我的问题。希望对你有点帮助。。。
uint8_t b[100] = { 0 };
/usr/lib-> nm libc.so | grep memset
[7122] | 201876| 104|FUNC |GLOB |0 |9 |_memset