我问了一个类似的问题,但我有一些更新让我很困惑。基本上,我想用链接器链接许多目标文件,如下所示:
/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
有趣的是,memset没有在reconf.c中引用,而且我也对整个目录进行了grep,但是在任何其他文件中也没有引用_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:致命:library -lc:未找到 ld:致命:文件处理错误。没有输出写入q
这虽然libc.so显然在/ usr / lib ...
混淆
编辑II:
进行更多研究似乎在Solaris 10上静态链接消失了,你可以在这里阅读:
http://blogs.oracle.com/rie/entry/static_linking_where_did_it
这可能是我的问题。有谁知道如何重写我的链接器命令以解决此问题?
非常感谢!
答案 0 :(得分:2)
可能你做过:
struct S v = { 0 };
或
struct S v;
v = (some const-variable).
或
uint8_t b[100] = { 0 };
有些编译器会隐式使用内置的memset(或memcpy)来处理这类事情。然后,内置的memset被称为_memset(在您的情况下)。一旦你链接了你的libc(或者在你的情况下提供标准功能的东西)没有提供它,你就会收到这个链接错误。
答案 1 :(得分:1)
假设你在Solaris上,你会在libc.so
库中找到memset:
/usr/lib-> nm libc.so | grep memset
[7122] | 201876| 104|FUNC |GLOB |0 |9 |_memset
只需将-lc
添加到命令行
答案 2 :(得分:0)
Memset是标准C库的库函数。如果您不使用gcc进行链接(默认情况下将文件与标准库链接),您应该明确地将您的progrom与libc链接。
另一种选择,可能你不使用libc。在这种情况下,memset调用可以由gcc生成。
来自man gcc
:
-nodefaultlibs
链接时不要使用标准系统库。只有您指定的库才会传递给链接器,指定系统库链接的选项(例如-static-libgcc或-shared-libgcc)将被忽略。除非使用-nostartfiles,否则标准启动文件将正常使用。 编译器可能会生成对memcmp,memset,memcpy和memmove的调用。这些条目通常由libc中的条目解析。指定此选项时,应通过其他机制提供这些入口点。
在这种情况下,只需编写memset(它是简单的proc。)并将其提供给链接器。