对“memcpy'”的未定义引用;由ld引起的错误

对“memcpy'”的未定义引用;由ld引起的错误,c,makefile,ld,memcpy,C,Makefile,Ld,Memcpy,我正在开发一个嵌入式项目,但由于这个错误,我很难编译它: mipsel-linux-gnu-ld:main.o:在函数“fooBar”中:main.c:(.text+0x3ec):未定义对“memcpy”的引用 此错误是由与此类似的每个操作引起的,在这些操作中,我将指针的值指定给非指针类型的变量 int a = 0; int *ap = &a; int c = *ap; //this causes the error 下面是另一个例子: state_t *exceptionStat

我正在开发一个嵌入式项目,但由于这个错误,我很难编译它:
mipsel-linux-gnu-ld:main.o:在函数“fooBar”中:main.c:(.text+0x3ec):未定义对“memcpy”的引用


此错误是由与此类似的每个操作引起的,在这些操作中,我将指针的值指定给非指针类型的变量

int a = 0;
int *ap = &a;
int c = *ap; //this causes the error
下面是另一个例子:

state_t *exceptionState = (unsigned int) 0x0FFFF000;
currentProcess->cpu_state = *excepetionState; //this causes the error
我已经在makefile中包含了标志
-nostlib


提前谢谢你

您包含了
-nostlib
这一事实是导致您出现问题的原因

如果复制结构,编译器可能会调用标准的C运行时函数
memcpy()
。如果您使用
-nostlib
链接,那么您告诉链接器不要包含标准的C运行时库


如果您必须使用
-nostlib
,那么您必须提供自己的
memcpy()

实现,因为您包含了
-nostlib

如果复制结构,编译器可能会调用标准的C运行时函数
memcpy()
。如果您使用
-nostlib
链接,那么您告诉链接器不要包含标准的C运行时库

如果必须使用
-nostlib
,则必须提供自己的
memcpy()
实现

把那面旗拿出来。它阻止与标准库调用的链接。编译器实际上可能会生成对memcpy函数的引用,即使您的代码没有显式调用它

如果您确实需要
-nostlib
,我想您可以定义自己版本的
memcpy
——如果这是链接器唯一抱怨的功能。它不会被优化,但会起作用。将以下代码添加到一个源文件的底部:

void *memcpy(void *dest, const void *src, size_t n)
{
    for (size_t i = 0; i < n; i++)
    {
        ((char*)dest)[i] = ((char*)src)[i];
    }
}
void*memcpy(void*dest,const void*src,size\u t n)
{
对于(大小i=0;i
把那面旗拿出来。它阻止与标准库调用的链接。编译器实际上可能会生成对memcpy函数的引用,即使您的代码没有显式调用它

如果您确实需要
-nostlib
,我想您可以定义自己版本的
memcpy
——如果这是链接器唯一抱怨的功能。它不会被优化,但会起作用。将以下代码添加到一个源文件的底部:

void *memcpy(void *dest, const void *src, size_t n)
{
    for (size_t i = 0; i < n; i++)
    {
        ((char*)dest)[i] = ((char*)src)[i];
    }
}
void*memcpy(void*dest,const void*src,size\u t n)
{
对于(大小i=0;i
非常感谢您的回答。不幸的是,我需要使用-nostlib标志,因为我的教授要求我使用它,而且因为我的程序需要在不能使用std库的嵌入式系统中运行。。。而类型size\u t只包含在stdlib中(或者我遗漏了什么吗?),结果是size\u t只是一个无符号int,现在代码可以工作了,谢谢你非常有用的回答
size\u t
不是
unsigned int
。它是
unsigned long
unsigned long
取决于您的CPU类型。非常感谢您的回答。不幸的是,我需要使用-nostlib标志,因为我的教授要求我使用它,而且因为我的程序需要在不能使用std库的嵌入式系统中运行。。。而类型size\u t只包含在stdlib中(或者我遗漏了什么吗?),结果是size\u t只是一个无符号int,现在代码可以工作了,谢谢你非常有用的回答
size\u t
不是
unsigned int
。它是
unsigned long
unsigned long
取决于您拥有的CPU类型。