2013-04-12 81 views
0

我過得好MinGW的這個錯誤插座proram: pr1.c是錯誤MinGW的編譯時在Windows

我遇到了一些問題,像這樣加入庫,但現在遇到這些錯誤的文件名:

$ 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

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秒的陣列,最標準的方式將是一個for環路隨後歸零struct正如我上面提到。


關於inet_pton功能,或許this question可以幫助你,建議使用WSAAddressToString功能。

+0

現在只有1個錯誤即將到來,那也是「inet_top」,我無法解決它 –

+0

@rahulkapoor,哪個錯誤即將到來?對於'inet_top',恐怕我無法幫助你,但是我連接的問題似乎有答案。如果你仍然無法解決這個問題,可以考慮在Windows中專門提出另一個關於'inet_top'的問題,提到你已經看到了我鏈接到的問題,但是它沒有解決你的問題。 – Shahbaz

+0

是的,我在說「inet_ntop」。鏈接中提到了一個替代方案,但我仍然無法解決它。如何將其轉換爲「wsaStringToAddress」。我嘗試了各種方法,但無法解決。 –

1
#include <string.h> 

錯誤消息告訴你gcc有bzero作爲內置函數。但是如果沒有範圍原型,則認爲您的用法是指返回int(默認返回類型)的函數。所以它與內置函數不匹配,而gcc只是將buck傳遞給鏈接器,它同樣沒有找到這樣的函數。添加頭文件,以便編譯器找到正確的原型。

您可能需要使bzero的東西,如:

#define _BSD_SOURCE 

如果不擺脫bzero錯誤的,那麼你真的應該拋棄它,並使用memset

inet_pton,您還需要:在Windows

#include <arpa/inet.h> 

本說明有關socket編程也可能是有用的:from Beej's Guide

+0

即使在添加#include

+0

後,它仍未運行?是否更改了錯誤? –

+0

不,我使用了BSD_SOURCE,而我目前使用作爲頭文件。但錯誤仍然相同 –