【问题标题】:Initialize array in gcc, undefined reference to `memcpy'在 gcc 中初始化数组,未定义对“memcpy”的引用
【发布时间】:2015-07-17 20:21:23
【问题描述】:

我在 Nachos3.4、Centos 6.0 中编写 C,由 gcc 2.95.3 编译,

我使用的命令行是gmake all

当我编译这个时,一切都很好

int main()
{
    char* fname[] = {"c(0)", "c(1)", "c(2)", "c(3)", "c(4)", "c(5)", "c(6)", "c(7)"};
    return 0;
}

但是当我这样做时,它说undefined reference to 'memcpy'

int main()
{
    char* fname[] = {"c(0)", "c(1)", "c(2)", "c(3)", "c(4)", "c(5)", "c(6)", "c(7)", "c(8)"};
    return 0;
}

问题出在哪里,我该如何解决?

【问题讨论】:

  • 请显示(最少)完整代码以重现此代码,包括您用于编译此代码的命令行。
  • 已编辑,再次检查
  • gcc 2.95.3 是相当过时的编译器,可能是由于 ABi 不兼容,与 CentOS 6.0 中的 libc 链接有问题?跨度>
  • GCC 2.95?哇。为什么不跨入 21 世纪?
  • 我尝试了最新的 gcc,但它与 nachos3.4 不兼容。

标签: c arrays linux gcc nachos


【解决方案1】:

您对自动fname 数组的初始化涉及编译器将大量数据从隐藏的static 数组复制到堆栈中的数组。 GCC 有几种可以用于此目的的技术,其中最喜欢的一种是调用 C 库 memcpy 例程,因为无论发生什么,这都应该很好而且很快。

在您的情况下,您似乎没有 C 库,所以这是一个问题。

您可以告诉 GCC 始终使用 x86 指令,而不是像这样调用库:

gcc -mstringop-strategy=rep_byte -c -O file.c

gcc -mstringop-strategy=loop -c -O file.c

但是,我的印象是 GCC 直到 3.x 中期版本才开始这样做。

也许您正在使用“MIPS”处理器,老师喜欢那个处理器,其中所需的选项是-mno-memcpy

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 2016-01-28
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多