【问题标题】:C-Socket Programming-"undefined reference"C-Socket Programming-“未定义的引用”
【发布时间】:2016-06-06 09:37:34
【问题描述】:

我是 C 中套接字编程的初学者。我得到了书中的代码,当我编译时,这些是未定义引用的以下错误。请给出纠正此问题的提示!谢谢!

代码:

#include <stdio.h>
#include <winsock.h>
#include <winsock2.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RCVBUFSIZE 32
int main(int argc, char *argv[]){
int sock;
struct sockaddr_in echoServAddr;
unsigned short echoServPort;
char *servIP;
char *echoString;
char echoBuffer[RCVBUFSIZE];
unsigned int echoStringLen;
int bytesRcvd, totalBytesRcvd;
if(argc>3 || argc>4){
    printf("Usage: %s <Server IP> <Echo Word> [<Echo Port>\n",argv[0]);
    exit(1);
}
servIP=argv[1];
echoString=argv[2];
if(argc==4){
    echoServPort=atoi(argv[3]);
}
else{
    echoServPort=7;
}
if((sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0){
    printf("socket() failed!");
}
memset(&echoServAddr,0,sizeof(echoServAddr));
echoServAddr.sin_family=AF_INET;
echoServAddr.sin_addr.s_addr=inet_addr(servIP);
echoServAddr.sin_port=htons(echoServPort);
if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0){
    printf("connect() failed!");
}
echoStringLen=strlen(echoString);
if(send(sock,echoString, echoStringLen,0)!=echoStringLen){
    printf("send() send maximum bytes than expected");
}
totalBytesRcvd=0;
printf("Received");
while(totalBytesRcvd<echoStringLen){
    if((bytesRcvd=recv(sock,echoBuffer,RCVBUFSIZE-1,0))<=0){
        printf("recv() failed!");
    }
    totalBytesRcvd+=bytesRcvd;
    echoBuffer[bytesRcvd]='\0';
    printf(echoBuffer);
}
close(sock);
exit(1);    
}

我收到如下错误:

In function `main':
        client.cpp:34: undefined reference to `_socket@12'
        client.cpp:39: undefined reference to `_inet_addr@4'
        client.cpp:40: undefined reference to `_htons@4'
        client.cpp:41: undefined reference to `_connect@12'
        client.cpp:45: undefined reference to `_send@16'
        client.cpp:51: undefined reference to `_recv@16'
        collect2.exe    [Error] ld returned 1 exit status

【问题讨论】:

  • 您忘记链接 Ws2_32.lib 库
  • 如何与 Ws2_32.lib 库链接?我使用 Dev C++ IDE。
  • 查看dev-c++文档。
  • @Nguyen Tan Dat,我已经编辑了我的答案,其中包含有关如何在您的 Dev C++ IDE 中使用 ws2_32.lib 的指南 :)

标签: c sockets tcpclient undefined-reference dev-c++


【解决方案1】:

根据我的观察,您正在尝试使用 MinGW 构建 Winsock 应用程序。

MinGW默认不会自动链接Winsock库(即Ws2_32.lib),所以需要手动告诉编译器使用- l 标志加上你的图书馆的名称。

gcc winsock.c -o winsock.exe -lws2_32

编辑:如果您是使用 MinGW 套件(Code::Block、DevC++ 等)的 IDE,您可以尝试找到可以手动添加编译器标志的选项,并添加 -lws2_32 进入你的编译器标志


编辑:根据您上面的评论,因此您使用的是 Dev-C++ IDE,下面是如何在您的 IDE 中使用 ws2_32.lib 库的指南

  1. 转到顶部菜单Tools,然后单击Compiler Options...

  2. Compiler Options内,勾选复选框Add the following commands when calling the compiler

  3. 将下面的编译器标志-lws2_32放入textarea

  4. 确定

再次尝试编译您的源代码。如果没有出错,你的程序应该编译成功了。

问候

【讨论】:

  • @Nguyen Tan Dat,如果我的回答对你有帮助,那么你点击Accept 按钮来勾选这个问题已经得到回答:)
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2014-09-14
  • 2013-01-08
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
相关资源
最近更新 更多