我在mingw上遇到了这个错误: pr1.c是文件名
我遇到了一些问题,然后像这样添加了库,但现在出现了这些错误:
$ gcc pr1.c -o pr1.exe -lwsock32 -lws2_32
pr1.c: In function 'main':
pr1.c:54:2: warning: incompatible implicit declaration of built-in function 'b
zero' [enabled by default]
C:\Users\rak\AppData\Local\Temp\ccMtb7Wt.o:pr1.c:(.text+0xc9): undefined refe
rence to `inet_pton'
C:\Users\rak\AppData\Local\Temp\ccMtb7Wt.o:pr1.c:(.text+0xe2): undefined refe
rence to `bzero'
C:\Users\rak\AppData\Local\Temp\ccMtb7Wt.o:pr1.c:(.text+0x1b5): undefined ref
erence to `bzero'
C:\Users\rak\AppData\Local\Temp\ccMtb7Wt.o:pr1.c:(.text+0x224): undefined ref
erence to `bzero'
c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: C:\Users\rak\AppData\Local\Temp\ccMtb7Wt.o: bad reloc address 0x20 in section `.eh_frame'
c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link
failed: Invalid operation
collect2.exe: error: ld returned 1 exit status
答案 0 :(得分:1)
bzero
是一个非标准函数,它已被弃用并从POSIX 2008中删除。来自bzero
的手册页:
遵守
4.3BSD。不推荐使用此函数(在POSIX.1-2001中标记为LEGACY):在新程序中使用memset(3)。 POSIX.1-2008删除了bzero()的规范。
因此,作为cnicutar suggested,您应该使用memset
代替:
memset(ptr, 0, sizeof *ptr);
作为旁注,请注意以下事实:如果ptr
的目标包含指针,则上面的memset
不会使指针为NULL,而只是0,其中 与NULL不同。
如果是struct
,最好的方法是这样的:
struct something
{
int a;
int b;
char *c;
int d;
};
struct something var;
...
var = (struct something){0}; /* or NULL if first argument is a pointer */
/* or alternatively */
var = (struct something){ .a = 0 };
对于struct
s的数组,最标准的方法是for
循环,然后将struct
归零,如上所述。
关于inet_pton
函数,也许this question可以帮助您,建议使用WSAAddressToString
函数。
答案 1 :(得分:1)
#include <string.h>
错误消息告诉您gcc将bzero
作为内置函数。但是如果没有范围内的原型,则会将您的用法视为引用返回int
(默认返回类型)的函数。因此它与内置函数不匹配,并且gcc只是将降压传递给链接器,类似地找不到这样的函数。添加头文件,以便编译器找到正确的原型。
您可能需要启用 bzero
,例如:
#define _BSD_SOURCE
如果这没有消除bzero
错误,那么你真的应该抛弃它并使用memset
。
对于inet_pton
,您还需要:
#include <arpa/inet.h>
关于Windows上套接字编程的说明可能也很有用:from Beej's Guide。