6

我正在尝试修复对memcpy_s()错误的未定义引用。我已经包含string.h在我的文件中并且该memcpy()功能可以正常工作,并且我也尝试过包含memory.h. 我在 x64 Windows 7 上并使用 gcc 4.8.1 进行编译。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void doMemCopy(char* buf, size_t buf_size, char* in, int chr) {
    memcpy_s(buf, buf_size, in, chr);
}

内存 forbuf已在 main 函数中分配,该函数调用doMemCpy(buf, 64, in, bytes). in是从标准输入读取的字符串

来自 cmd 终端的确切错误:

未定义对“memcpy_s”collect2.exe 的引用:错误:ld 返回 1 退出状态

4

2 回答 2

10

memcpy_s据我所知,GCC 4.8 不包括 function或任何其他 _s 边界检查函数。这些功能在 ISO 9899:2011 附录 K 中定义,它们是可选的实施。在使用它们之前,您必须检查是否__STDC_LIB_EXT1__已定义。

这些功能最初是由微软实现的,许多方面反对将它们包含在标准中。我认为主要的反对意见是函数完成的错误处理涉及线程之间共享的全局回调句柄,但它们也非常低效。

进一步阅读 Carlos O'Donell 和 Martin Sebor 的附录 K 的更新现场经验 — 边界检查接口

于 2016-10-20T19:14:34.240 回答
5

我从来没有用过这个,但是AFAIK,你需要添加

#define __STDC_WANT_LIB_EXT1__ 1

#include <string.h>

使用memcpy_s().

于 2015-07-07T20:03:34.933 回答