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

中文QNX 讨论: 欢迎大家灌水,讨论有关QNX 问题。
回复
goodlove2
Senior Member
帖子: 77
注册时间: 周五 2月 25, 2005 4:34 pm

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

帖子 goodlove2 » 周三 3月 23, 2005 1:57 pm

错误信息如下
#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);
}

goodlove2
Senior Member
帖子: 77
注册时间: 周五 2月 25, 2005 4:34 pm

帖子 goodlove2 » 周三 3月 23, 2005 2:07 pm

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

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

goodlove2
Senior Member
帖子: 77
注册时间: 周五 2月 25, 2005 4:34 pm

帖子 goodlove2 » 周三 3月 23, 2005 3:02 pm

急........
请教.
可能是某个文件没在放到指定位置上吧?
我用别的网络源码,也发生这样的问题.
#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

到底是什么原因?
上次由 goodlove2 在 周三 3月 23, 2005 5:07 pm,总共编辑 1 次。

goodlove2
Senior Member
帖子: 77
注册时间: 周五 2月 25, 2005 4:34 pm

帖子 goodlove2 » 周三 3月 23, 2005 4:45 pm

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

power_du
Senior Member
帖子: 149
注册时间: 周五 9月 12, 2003 4:37 am

帖子 power_du » 周三 3月 23, 2005 4:51 pm

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

gcc -o client client.c -lsocket

good luck!

goodlove2
Senior Member
帖子: 77
注册时间: 周五 2月 25, 2005 4:34 pm

帖子 goodlove2 » 周三 3月 23, 2005 5:12 pm

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

xtang
Moderator
帖子: 1816
注册时间: 周五 9月 12, 2003 4:14 am
来自: China

帖子 xtang » 周四 3月 24, 2005 1:05 am

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

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

goodlove2
Senior Member
帖子: 77
注册时间: 周五 2月 25, 2005 4:34 pm

帖子 goodlove2 » 周四 3月 24, 2005 11:13 am

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


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

xtang
Moderator
帖子: 1816
注册时间: 周五 9月 12, 2003 4:14 am
来自: China

帖子 xtang » 周四 3月 24, 2005 12:13 pm

#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。

其它的依此类推。

goodlove2
Senior Member
帖子: 77
注册时间: 周五 2月 25, 2005 4:34 pm

帖子 goodlove2 » 周四 3月 24, 2005 1:12 pm

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

回复