求助:程序编译时出现如下问题.实在是不知道哪里有问题.

错误信息如下
#gcc -o client.o client.c
/tmp/ccUGRzYU.o: In function ‘main’:
/tmp/ccUGRzYU.o(.text+0x45):undefined reference to ‘gethostbyname’
/tmp/ccUGRzYU.o(.text+0xda):uncefined reference to ‘socket’
/tmp/ccUGRzYU.o(.text+0x185):uncefined reference to ‘connect’
collect2: ld returned 1 exit status

源文件如下
/客户端程序 client.c**/
#include “stdio.h”
#include “stdlib.h”
#include “errno.h”
#include “sys/types.h”
#include “sys/socket.h”
#include “unistd.h”
#include “netinet/in.h”
#include “netdb.h”

int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;

if(argc!=3) {
fprintf(stderr,“Usage:%s hostname portnumber\a\n”,argv[0]);
exit(1);
}

if((host=gethostbyname(argv[1]))==NULL) {
fprintf(stderr,“Gethostname error\n”);
exit(1);
}

if((portnumber=atoi(argv[2]))<0) {
fprintf(stderr,“Usage:%s hostname portnumber\a\n”,argv[0]);
exit(1);
}

/客户程序开始建立 sockfd描述符/
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {
fprintf(stderr,“Socket Error:%s\a\n”,strerror(errno));
exit(1);
}

/客户程序填充服务端的资料/
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);

/客户程序发起连接请求/
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) {
fprintf(stderr,“Connect Error:%s\a\n”,strerror(errno));
exit(1);
}

if((nbytes=read(sockfd,buffer,1024))==-1) {
fprintf(stderr,“Read Error:%s\n”,strerror(errno));
exit(1);
}
buffer[nbytes]=’’;
printf(“I have received:%s\n”,buffer);
close(sockfd);
exit(0);
}

初学者.
这个问题我实在是找不根源了…

不知道怎么解决,请高手指点.

急…
请教.
可能是某个文件没在放到指定位置上吧?
我用别的网络源码,也发生这样的问题.
#gcc -o client.o client.c
/tmp/ccUGRzYU.o: In function ‘main’:
/tmp/ccUGRzYU.o(.text+0x45):undefined reference to ‘gethostbyname’
/tmp/ccUGRzYU.o(.text+0xda):uncefined reference to ‘socket’
/tmp/ccUGRzYU.o(.text+0x185):uncefined reference to ‘connect’
collect2: ld returned 1 exit status

到底是什么原因?

Sorry for the dumb question… and thanks a million!!

少加了静态库的编译选项了

gcc -o client client.c -lsocket

good luck!

power_d先生,Good luck,成功编译了,
但我不知道为什么加-lsocket 呢?
我如何知道对哪些文件加入什么样的编译选项呢?
Email:lsx_workroom@sina.com.cn

出错信息告诉你,有3个函数在链接时没有找到。

你可以去函数库参照查看这3个函数的说明,里面有一项“Library”告诉了你该当函数存在于哪一个函数库中。如果函数不在libc内,你要加入-l

Xtang先生,如你所说,请举个例子呗?
比如上面的错误信息,为什么加入了 -lsocket 就可以通过编译呢?而且socket.h并没有这三个错误的函数啊.
你说的函数库指的就是.h文件吗?还是指的别的东西?我去哪找Library这一项呢?libc又是什么?
回过头总体来说,就加上了-lsocket.?


你说的这些,我以前还未接触过,请介绍一下,Thank a million

#gcc -o client.o client.c
/tmp/ccUGRzYU.o: In function ‘main’:
/tmp/ccUGRzYU.o(.text+0x45):undefined reference to ‘gethostbyname’
/tmp/ccUGRzYU.o(.text+0xda):uncefined reference to ‘socket’
/tmp/ccUGRzYU.o(.text+0x185):uncefined reference to ‘connect’

也就是说,最后链接时找不到gethostbyname(), socket(), connect() 三个函数。到你的HelpViewer里去找Library Reference,然后找socket()的说明(这里有个在线的版本),可以看到里面Library一节里提到了libsocket。

这个告诉了你,如果你的程序使用了这个函数,你就需要链接libsocket函数库,也就是在命令行上加-lsocket。

其它的依此类推。

I see.
Mr.xtang,Thank a million for you!