2011-03-07 123 views
7

我已經收到這個錯誤很長時間了,Google也沒有太多幫助。對getaddrinfo的未定義引用

我是Winsock編程的新手,並試圖從在線資源學習。我正在嘗試使用MSDN網站上的詳細信息構建一個簡單的服務器。每當我編譯代碼(MinGW)時,就會看到標題(Undefined reference to getaddrinfo)中提到的錯誤。下面是代碼:

#ifndef WIN32_LEAN_AND_MEAN 
#define WIN32_LEAN_AND_MEAN 
#endif 
#define WINVER WindowsXP 

#include <windows.h> 
#include <winsock2.h> 
#include <winsock.h> 
#include <ws2tcpip.h> 
#include <stdio.h> 

int main() { 
    WSADATA wsaData; 
    int iResult; 
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData); 
    if (iResult != 0) { 
     printf("WSAStartup failed: %d\n", iResult); 
     return 1; 
    } 

    #define DEFAULT_PORT "27015" 

    struct addrinfo *result = NULL, *ptr = NULL, hints; 

    ZeroMemory(&hints, sizeof (hints)); 
    hints.ai_family = AF_INET; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 
    hints.ai_flags = AI_PASSIVE; 

    // Resolve the local address and port to be used by the server 
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); 
    if (iResult != 0) { 
     printf("getaddrinfo failed: %d\n", iResult); 
     WSACleanup(); 
     return 1; 
    } 
    return 0; 
} 

我用下面的命令編譯:

gcc msdn_np.c -o msdn_np.exe -lWS2_32 

回答

10

是不是同樣的問題嗎?

http://programmingrants.blogspot.com/2009/09/tips-on-undefined-reference-to.html

基本上不要忘記WS2_32.LIB鏈接(該消息是從連接器,所以這應該是真正的原因),但你似乎在做已經。

...如果你使用的是Windows編程工具的舊版本,那麼你可以通過在包含頭文件之前加入#define _WIN32_WINNT 0x0501(不太可能現在仍然是必要的,但也許)來使用XP以上的版本。

這可能是其他簡單的問題。正常(Unix)的庫約定是用lib預先安裝它們。此後,-lWS32_32的含義是搜索名稱爲libWS32_32.a的文件。它很可能找不到它,因爲它缺少包含該庫的目錄的路徑。您可以添加一個-L,然後添加到正確目錄的路徑。或者,您甚至不需要-l鏈接庫,只需將庫的完整路徑(在這種情況下文件系統上顯示的文件的真實名稱)也可以工作。

該問題也可能與路徑有關。例如,如果庫的路徑包含空格,則會發生問題。如果是這樣,你可以嘗試把你的庫文件放在一個名稱更簡單的目錄中。

請給出您的實際配置(在哪個目錄下是庫文件)以及您實際嘗試的一些反饋。你也可以嘗試設置LIBS和LIBPATH環境變量(最簡單的方法可能是通過makefile來完成)。

+0

但我正在鏈接庫Ws2_32(請參閱OP中的第三行),但我仍然遇到問題,這是令人沮喪的。 – check123 2011-03-07 17:17:58

+0

我猜想與核電廠和明戈合作非常棘手。我更改爲CodeBlocks,並將鏈接器設置更改爲包含Ws2_32.dll,現在其工作正常。謝謝! – check123 2011-03-08 17:19:00

0

WindowsXPw32api.h定義,您在#define WINVER之前必須#include <w32api.h>