0

我在 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
4

2 回答 2

2
#include <string.h>

错误消息告诉您 gcc 具有bzero内置功能。但是如果没有原型在范围内,您的用法被认为是指返回一个int(默认返回类型)的函数。所以它与内置函数不匹配,gcc 只是将责任传递给链接器,链接器同样找不到这样的函数。添加头文件以便编译器找到正确的原型。

您可能需要启用 bzero以下内容:

#define _BSD_SOURCE

如果这不能消除bzero错误,那么你真的应该放弃它并使用memset.

对于inet_pton,您还需要:

#include <arpa/inet.h>

这篇关于 Windows 上的套接字编程的说明也可能很有用:来自 Beej's Guide

于 2013-04-12T08:32:41.830 回答
1

bzero是一个非标准函数,它已被弃用并从 POSIX 2008 中删除。从手册页bzero

符合 4.3BSD
。此函数已弃用(在 POSIX.1-2001 中标记为 LEGACY):在新程序中使用 memset(3)。POSIX.1-2008 删除了 bzero() 的规范。

因此,正如 cnicutar建议的那样,您应该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 };

对于 s 数组struct,最标准的方法是for循环,然后将 s 归零,struct如上所述。


关于inet_pton功能,也许这个问题可以帮助你,建议使用WSAAddressToString功能。

于 2013-04-12T08:26:47.127 回答