免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3264 | 回复: 19
打印 上一主题 下一主题

[函数] 为什么include了头函数,仍然不能用里面定义的函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-04-02 09:58 |只看该作者 |倒序浏览
程序:timeclient.c
#include <stdio.h>;               
#include <sys/types.h>;               
#include <netinet/in.h>;               
#include <sys/socket.h>;               
#include <netdb.h>;               
#include <unistd.h>;
#include <string.h>;

#define        HOSTNAMELEN        40       
#define        BUFLEN                1024       
#define        PORT                13        /* port of daytime server   */

int main(int argc, char *argv[])
{
     int                        rc;            
     int            sockfd;             /* socket descriptor */
     char                buf[BUFLEN+1];
     char*                pc;            
     struct sockaddr_in        sa;            
     struct hostent*     hen;              

     if (argc < 2) {
             fprintf(stderr, "Missing host name\n";
             exit (1);
     }

     /* Address resolution */
     hen = gethostbyname(argv[1]);
     if (!hen) {
           perror("couldn't resolve host name";
     }

     memset(&sa, 0, sizeof(sa));
     sa.sin_family = AF_INET;
     sa.sin_port = htons(PORT);
     memcpy(&sa.sin_addr.s_addr, hen->;h_addr_list[0], hen->;h_length);

     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) {
             perror("socket() failed";
     }

     rc = connect(sockfd, (struct sockaddr *)&sa, sizeof(sa));
     if (rc) {
             perror("connect() failed";
     }

     /*  reading the socket        */
     pc = buf;
     while (rc = read(sockfd, pc, BUFLEN - (pc-buf))) {
         pc += rc;
     }

     /* close the socket */
     close(sockfd);
     /* pad a null character to the end of the result */
     *pc = '\0';
     /* print the result */
     printf("Time: %s", buf);
     /* and terminate */
     return 0;
}

(这是unix网络编程与分析里的第一个程序,不好意思,我是初学者)

运行 gcc timeclient.c -lsocket
返回说:gethostbyname函数没有定义,已经加入了<netdb.h>;的头文件了阿,应该怎么办呢?

论坛徽章:
0
2 [报告]
发表于 2004-04-02 12:32 |只看该作者

为什么include了头函数,仍然不能用里面定义的函数

直接gcc -o timeclient timeclient.c
就可以了

论坛徽章:
0
3 [报告]
发表于 2004-04-02 15:47 |只看该作者

为什么include了头函数,仍然不能用里面定义的函数

还是不行阿,这次连socket,connect,都找不到了
我要连接socket库的话,要用-lsocket,那么我要连接netdb的话应该用什么名字呢?
我听说,-l选项后面跟的名字并不是库的文件名,可是查gcc的手册也没说那些库都应该是什么名字阿,那么高手们编译的时候怎么知道该用什么名字呢?
难道都去问高高手:)

论坛徽章:
0
4 [报告]
发表于 2004-04-02 16:47 |只看该作者

为什么include了头函数,仍然不能用里面定义的函数

原帖由 "relleber" 发表:
>;h_length);

     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) {
             perror("socket() failed";
     }

     rc = connect(sockfd, (struct sockaddr *)&sa, sizeof(sa));..........


什么 OS

论坛徽章:
0
5 [报告]
发表于 2004-04-02 17:05 |只看该作者

为什么include了头函数,仍然不能用里面定义的函数

solaris 8 for sparc
gcc 3.3.2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
是不是我说得复杂了些
现在有一个函数gethostbyname()是在netdb.h这个头文件中定义的
我现在编译了一个使用了这个函数的程序,报错说没有定义
但是我已经在程序中#include <netdb.h>;了,该怎么办

论坛徽章:
0
6 [报告]
发表于 2004-04-02 19:07 |只看该作者

为什么include了头函数,仍然不能用里面定义的函数

gcc foo.c -lnsl -lsocket -lresolv

论坛徽章:
0
7 [报告]
发表于 2004-04-03 02:40 |只看该作者

为什么include了头函数,仍然不能用里面定义的函数

man gcc里没有这些参数的解释,-lnsl -lsocket -lresolv。老兄是从哪里看来的??

还有请教Makefile的帮助文档在哪里?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-04-03 12:04 |只看该作者

为什么include了头函数,仍然不能用里面定义的函数

原帖由 "release" 发表:
man gcc里没有这些参数的解释,-lnsl -lsocket -lresolv。老兄是从哪里看来的??

还有请教Makefile的帮助文档在哪里?

这个版的精华区里面有。

论坛徽章:
0
9 [报告]
发表于 2004-04-03 16:01 |只看该作者

为什么include了头函数,仍然不能用里面定义的函数

大侠!谢谢!是不是因为solaris所以才会这样,linux下好像不会,为什么?
如果自己写的一个头文件,那么是不是先编译生成 .o的文件(.h头文件能直接编译吗),再用ar命令来创建一个新的库呢?
头文件对应什么库名有没有相关的文档阿?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我很面所以不懂的很多 :)

论坛徽章:
0
10 [报告]
发表于 2004-04-03 16:26 |只看该作者

为什么include了头函数,仍然不能用里面定义的函数

这种问题是由操作系统的差异造成的,linux在编译时会自动连接一些库,而solaris不会。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP