undefined reference to `memcpy' 由 ld 引起的错误

undefined reference to `memcpy' error caused by ld

我正在开发一个嵌入式项目,由于这个错误而难以编译它:
mipsel-linux-gnu-ld: main.o: in function 'fooBar':main.c:(.text+0x3ec): undefined reference to '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 中包含了标志 -nostdlib...
提前致谢!

您包含 -nostdlib 的事实是导致您出现问题的原因。

如果您复制结构,编译器可能会调用标准 C 运行时函数 memcpy() 来执行此操作。如果您 link 和 -nostdlib 那么您是在告诉 link 用户不要包含标准 C 运行时库。

如果您必须使用 -nostdlib,那么您必须提供自己的 memcpy() 实现。

I have already included the flag -nostdlib in the makefile...

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

如果您绝对需要 -nostdlib,我想您可以定义自己的 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];
    }
}