LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 957|回复: 6

请教,这个Makefile怎么写?

[复制链接]
发表于 2004-4-9 16:31:56 | 显示全部楼层 |阅读模式

  1. 这是主函数:
  2. #include <fcntl.h>
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. int
  7. main(void)
  8. {
  9.     int fd;
  10.     ssize_t n;
  11.     char buf[MAXLINE];
  12.     fd=Open("/etc/fstab",O_RDONLY);
  13.     n=Read(fd,buf,MAXLINE);
  14.     Write(stdout,buf,n);
  15.     return(0);
  16. }
  17. 以下是Open.c Read.c Write.c 子函数。
  18. # cat Open.c
  19. #include <sys/types.h>
  20. #include <sys/stat.h>
  21. #include <fcntl.h>
  22. int
  23. Open(const char *path,int flags)
  24. {
  25.        int fd;
  26.        if((fd=open(path,flags))<0) {
  27.                  printf("open error\n");
  28.                  return(1);
  29.        }
  30.        return(fd);
  31. }


  32. # cat Read.c
  33. #include <stdio.h>
  34. #include <unistd.h>
  35. #include <sys/types.h>
  36. #define MAXLINE 8192
  37. ssize_t
  38. Read(int fd, void * buf,ssize_t n)
  39. {
  40.         if((n=read(fd,buf,MAXLINE)) != n ) {
  41.                printf("read error\n");
  42.                return(-1);
  43.         }
  44.         return(n);
  45. }


  46. # cat Write.c
  47. #include <stdio.h>
  48. #include <unistd.h>
  49. #include <sys/types.h>
  50. ssize_t
  51. Write(int fd,const char *buf,ssize_t n)
  52. {
  53.      if((n=write(fd,buf,n)) != n) {
  54.             printf("write to stdout error\n");
  55.             return(1);
  56.      }
  57.      return(0);
  58. }


  59. 这是Makefile
  60. # cat Makefile
  61. f:      f.o     Open.o  Read.o  Write.o
  62. cc      f.o     Open.o  Read.o  Write.o -o      f
  63. Open.o: Open.c
  64. cc      -c      Open.c
  65. Read.o: Read.c
  66. cc      -c      Read.c
  67. Write.o:        Write.c
  68. cc      -c      Write.c

复制代码


以下是出错的信息:

  1. "Makefile" ,line 2 : Need an operator
  2. "Makefile" ,line 4 : Need an operator
  3. "Makefile" ,line 6 : Need an operator
  4. "Makefile" ,line 8 : Need an operator
  5. make : fatal errors encountered -- can not conintue
复制代码


是我的程序写错了还是Makfile错了,请指教!谢谢。
发表于 2004-4-9 17:11:42 | 显示全部楼层
假设你的主函数为main.c。

  1. all : main

  2. main : main.o read.o write.o open.o
  3.         gcc -o main main.o read.o write.o open.o

  4. main.o : main.c
  5.         gcc -c main.c -o main.o

  6. read.o : read.c
  7.         gcc -c read.c -o read.o

  8. write.o : write.c
  9.         gcc -c write.c -o write.o

  10. open.o : open.c
  11.         gcc -c open.c -o open.o
复制代码
 楼主| 发表于 2004-4-9 17:55:33 | 显示全部楼层
谢谢,已编译成功,但怎么没有输出哦。。:confused: :confused: 这个程序没有作用。。。
发表于 2004-4-9 18:18:29 | 显示全部楼层
你的main.c里没有那三个函数的原型,应该把函数原型放到一个头文件里,在.c文件里包含这个头文件

你的Read函数里
if((n=read(fd,buf,MAXLINE)) != n ) {
应该是:
if((n=read(fd,buf,MAXLINE)) < 0 ) {

Write函数里
if((n=write(fd,buf,n)) != n) {
应该是:
if(write(fd,buf,n) != n) {
 楼主| 发表于 2004-4-10 16:37:17 | 显示全部楼层
谢谢俩版主!!现在一切顺利。

照着斑竹的格式写了个echo service ,是服务器端的,各个C程序文件都编译通过。这是Makefile ,不知道那里写错了。请指教!!

  1. all : udp_echo
  2. udp_echo : udpserv01.o dg_echo.o Socket.o Sendto.o Recvfrom.o
  3.         gcc -o udp_echo udpserv01.o dg_echo.o Socket.o Sendto.o Recvfrom.o
  4. udpserv01.o : udpserv01.c
  5.         gcc -c udpserv01.c -o udpserv01.o
  6. dg_echo.o : dg_echo.o
  7.         gcc -c dg_echo.c -o dg_echo.o
  8. Socket.o : Socket.c
  9.         gcc -c Socket.c -o Socket.o
  10. Sendto.o : Sendto.c
  11.         gcc -c Sendto.c -o Sendto.o
  12. Recvfrom.o : Recvfrom.c
  13.         gcc -c Recvfrom.c -o Recvfrom.o

复制代码


这是make的结果,各个*.o文件出来了。

  1. gcc -c udpserv01.c -o udpserv01.o
  2. Graph cycles through dg_echo.o

  3. gcc -c Socket.c -o Socket.o
  4. gcc -c Sendto.c -o Sendto.o
  5. gcc -c Recvfrom.c -o Recvfrom.o
  6. `all' not remade because of errors.
复制代码


这是dg_echo.c

  1. #include        "unp.h"
  2. void
  3. dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
  4. {
  5.         int                     n;
  6.         socklen_t       len;
  7.         char            mesg[MAXLINE];
  8.         for ( ; ; ) {
  9.                 len = clilen;
  10.                 n = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
  11.                 Sendto(sockfd, mesg, n, 0, pcliaddr, clilen);
  12.         }
  13. }
复制代码


系统是FreeBSD4.8,不知道哪里写错了
:help :help :help
发表于 2004-4-10 16:48:29 | 显示全部楼层
呵呵,直接看看不就清楚了?
  1. dg_echo.o : dg_echo.o
  2.         gcc -c dg_echo.c -o dg_echo.o
复制代码

应该是:
  1. dg_echo.o : dg_echo.c
  2.         gcc -c dg_echo.c -o dg_echo.o
复制代码

你把.c写成.o了
 楼主| 发表于 2004-4-10 16:52:33 | 显示全部楼层
谢谢版主,伤心,怎么都错在那些地方。。:eek: :eek: :eek: :confused:

有什么命令检查Makefile得1语法吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表