我有一个C函数,如下所示:

static uint32_t initrd_read(fs_node_t *node,
    uint32_t offset, uint32_t size, uint8_t *buffer) {

    initrd_file_header_t header = file_headers[node->inode];
    if (offset > header.length)
        return 0;
    if (offset+size > header.length)
        size = header.length-offset;
    memcopy(buffer, header.offset+offset, size);
    return size;
}

当与程序的其余部分链接时,将抛出undefined reference to 'memcpy'memcpy从未在代码中使用,也未定义。代码是独立链接的,因此与C库不冲突。由于某种原因,链接器认为上面的函数在函数调用开始时调用了memcpy,我不知道为什么。
为什么会这样?

最佳答案

编译器可以隐式地使用memcpy来执行“长”复制操作(如结构赋值)。例如,在代码中

initrd_file_header_t header = file_headers[node->inode];

这看起来是一个很好的候选者,它实际上将被转换成一个memcpy调用。
是否有理由创建initrd_file_header_t对象的副本而不是直接访问原始对象?我看不出你修改了那个对象,所以你可以
const initrd_file_header_t *header = &file_headers[node->inode];

并访问header->length等字段,这可能会消除对memcpy的隐式调用。

关于c - undefined reference 从未使用过/未定义/什么功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12812712/

10-13 08:07