【问题标题】:undefined reference to `memcpy' error caused by ldld 引起的对“memcpy”错误的未定义引用
【发布时间】:2021-03-26 01:06:19
【问题描述】:

我正在开发一个嵌入式项目,但由于以下错误而难以编译它:
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...
提前谢谢!

【问题讨论】:

    标签: c makefile ld memcpy


    【解决方案1】:
    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];
        }
    }
    

    【讨论】:

    • 非常感谢您的回答。不幸的是,我需要使用 -nostdlib 标志,因为我的教授要求我使用它,并且因为我的程序需要在无法使用标准库的嵌入式系统中运行......并且类型 size_t 仅包含在标准库中(还是我错过了什么?)
    • 原来 size_t 只是一个无符号整数,现在代码可以工作了,感谢您非常有帮助的回答!
    • size_t 不是 unsigned int。它是 unsigned longunsigned long long,具体取决于您拥有的 CPU 类型。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 1970-01-01
      相关资源
      最近更新 更多