Undefined reference to memcpy_s
我正在尝试修复对memcpy_s()错误的未定义引用。 我已经在文件中包含了string.h,并且memcpy()函数可以正常工作,并且我还尝试了包含memory.h。 我在x64 Windows 7上并使用gcc 4.8.1进行编译。
1 2 3 4 5 6 7
| #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);
} |
buf的内存已在调用doMemCpy(buf, 64, in, bytes)的主函数中分配。 in是从标准输入读取的字符串
来自cmd终端的确切错误:
undefined reference to"memcpy_s" collect2.exe: error: ld returned 1 exit status
-
buf和in是否都已分配? 您得到的确切错误是什么? 显示调用函数的上下文
-
buf已在main()函数中分配,并且in是从标准输入读取的字符串。 我得到的错误是undefined reference to"memcpy_s" collect2.exe: error: ld returned 1 exit status
-
新信息应添加到问题中。 请将评论中的信息添加到您的问题中。
-
@jhinzmann不是必需的。 它与实际问题无关。
-
是否试图链接到错误的版本?
据我所知,GCC 4.8不包含函数memcpy_s或任何其他_s边界检查函数。 这些功能在ISO 9899:2011附录K中定义,并且是可选的实现。 在使用它们之前,必须检查是否定义了__STDC_LIB_EXT1__。
这些功能最初是由Microsoft实现的,许多团体都反对将它们包含在标准中。 我认为主要的反对意见是,由函数完成的错误处理涉及线程之间共享的全局回调句柄,但它们的效率也很低。
卡洛斯·奥多内尔(Carlos O'Donell)和马丁·塞博尔(Martin Sebor)可以从附件K中的最新实地经验—边界检查接口中获得更多阅读信息。
我从未使用过,但是AFAIK,您需要添加
1
| #define __STDC_WANT_LIB_EXT1__ 1 |
之前
使用memcpy_s()。
-
参考:en.cppreference.com/w/c/string/byte/memcpy
-
这是否还需要-std=c11编译选项?
-
不。多数民众赞成在C11。
-
@FredLarson从您提供的参考看来似乎如此。 memcpy_s是因为c11。
-
引用上面的引用,作为所有边界检查的函数,只有在实现定义了STDC_LIB_EXT1且用户在包含string.h之前将STDC_WANT_LIB_EXT1定义为整数常量1时,memcpy_s才保证可用。您说的定义应该在#include 行之前
-
@RakholiyaJenish:Id也可能在编译行中定义它:-DSTDC_WANT_LIB_EXT1=1
-
我在#include 之前加入了#define __STDC_WANT_LIB_EXT1__ 1,而我仍然遇到相同的错误。当我尝试使用-std=c11进行编译时,除了未定义的参考错误外,我还会得到warning: implicit declaration of function"memcpy_s" [-Wimplicit-function-declaration]
-
我没有访问同一编译器的权限,但该错误似乎不太可能与标头,定义甚至编译无关,因为这是一个链接时错误,指示库中缺少该错误(可能是因为未将其编译为支持它)。当然,除非memcpy_s()是静态内联函数或宏。