QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1551|回复: 23

makefile出错求助

[复制链接]
发表于 2004-7-24 09:48:54 | 显示全部楼层 |阅读模式
我编写了一个makefile文件,格式没有错误
但使用make进行编译时总出现
missing separator
的错误,无法处理,请各位高手能帮忙解答
谢谢!
发表于 2004-7-24 14:05:20 | 显示全部楼层
贴出来看看
回复

使用道具 举报

 楼主| 发表于 2004-7-24 19:03:14 | 显示全部楼层
a.out: main.o factorial.o
   gcc -o a.out main.o factorial.o
factorial.o: factorial.c
   gcc -c factorial.c
main.o: main.c
   gcc -c main.c
回复

使用道具 举报

发表于 2004-7-24 22:03:57 | 显示全部楼层
“missing separator”意为缺少分隔符,应编辑该makefile文件,用tab键在有gcc的每行之前插入空白。
回复

使用道具 举报

 楼主| 发表于 2004-7-24 22:36:49 | 显示全部楼层
非常感谢,已解决问题。
我正在学习编一个简单shell的命令解释和执行的程序,
哪位大虾有相关源代码可否提供参考?
万分感谢!!!!!
回复

使用道具 举报

 楼主| 发表于 2004-7-25 00:06:55 | 显示全部楼层
请教:如果用gcc编译程序成功
但执行时提示“段错误”应该如何解决?
回复

使用道具 举报

 楼主| 发表于 2004-7-25 00:30:59 | 显示全部楼层
#include <sys/types.h>
#include <dirent.h>
#include "ourhdr.h"
int
main(int argc,char *argv[])
{
    DIR *dp;
    struct dirent *dirp;
    if (argc!=2)
         printf("a single argument (the directory name) id required");
    if ( (dp=opendir(argv[1]))==NULL)
         printf("can't open %s",argv[1]);
  
     while ( (dirp=readdir(dp))!=NULL)
          printf("%s\n",dirp->d_name);
     closedir(dp);
    exit(0);
}
回复

使用道具 举报

发表于 2004-7-25 09:48:16 | 显示全部楼层
应该在"if(argc!=2)"(建议改为if(argc<2),意为"如果不带参数运行";不然参数多时如argc=3、4、10的话它亦不等于2)语句段中打印完提示后退出或对当前目录进行处理然后退出,否则未处理这种情况却又继续执行dp=opendir(argv[1])当然会出现段错误了,因为此时argv[1]为空指针!
回复

使用道具 举报

 楼主| 发表于 2004-7-25 11:21:36 | 显示全部楼层
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#define BLKSIZE 1024

char *get_perms(struct stat *sbuf,char *perms)
{
   static char *modes[]={"---","--x","-w-","r--","r-x","rw-","rwx"};/* */
   int i,j;
   *perms='\0';
    /*  */
    for(i=2;i>=0;i--){
    j=(sbuf->st_mode>>(i*3))&07;
    strcat(perms,modes[j]);
   }
   
   if((sbuf->st_mode &S_ISUID)!=0)
     perms[2]='s';
   if((sbuf->st_mode &S_ISGID)!=0)
     perms[5]='s';
   if((sbuf->st_mode &S_ISUID)!=0)
     perms[8]='t';
    return perms;
}


char *get_perms(struct stat *,char *);
   void list(char *);
   void printout(char *,char *);
int main(int argc,char *argv[])
  {
   struct stat sbuf;
   if(argc<2){
    list(".");
     exit(0);
    }

   while(--argc){
       if(stat(* ++argv,&sbuf)<0){
         printf(*argv);
         continue;
     }
        if((sbuf.st_mode &S_IFMT)==S_IFDIR)
            list(*argv);
            else
              printout(".",*argv);
       }
     exit(0);
}

void list(char *name)
{
    DIR *dp;
    struct dirent *dir;
     if((dp=opendir(name))==NULL){
      fprintf(stderr,"%s:cannot open.\n",name);
       exit(0);
     }

    while((dir=readdir(dp))!=NULL)
       printout(name,dir->d_name);
      closedir(dp);
      return;
    }
void printout(char *dir,char *name)
{
  int i,j;
  char perms[10];
   struct stat sbuf;
   char newname[BLKSIZE];
   
   sprintf(newname,"%s/%s",dir,name);
   stat(newname,&sbuf);
   printf("%5d",(sbuf.st_size+BLKSIZE-1)/BLKSIZE);
   switch(sbuf.st_mode &S_IFMT){
    case S_IFREG:putchar('-');break;
    case S_IFDIR:putchar('d');break;
    case S_IFCHR:putchar('c');break;
    case S_IFBLK:putchar('b');break;
    case S_IFIFO:putchar('l');break;
#ifdef S_IFLNK
    case S_IFLNK:putchar('l');break;
#endif
#ifdef S_IFSOCK
    case S_IFSOCK:putchar('l');break;
#endif
    default:putchar('?');break;
}
    get_perms(&sbuf,perms);
    printf("%s%3d%-5d",perms,sbuf.st_nlink,sbuf.st_uid,sbuf.st_gid);
    printf("%7d %.20s",sbuf.st_size,ctime(&sbuf.st_mtime));
    printf("%s\n",name);
    }
回复

使用道具 举报

 楼主| 发表于 2004-7-25 11:55:39 | 显示全部楼层
版主真是英明,我佩服得五体投地
能否再帮忙看一下上面的程序,也是出现“段错误”
谢谢!
回复

使用道具 举报

发表于 2004-7-25 12:48:17 | 显示全部楼层
问题主要出在printout()函数,你可以先将整个函数注释起来,然后只写几行简单的代码,比如:
[code:1]
void printout(char *dir,char *name)
{
  char newname[BLKSIZE];
  sprintf(newname,"%s/%s",dir,name);
  printf("Full filename:%s\n",newname); //打印完整文件名(包括路径)以测试结果是否正确
}
[/code:1]

编译后运行能正确显示指定目录或当前目录(省略目录参数时)下的所有文件,验证了错误确由原来的printout()函数所致。你慢慢检查printout()余下的代码并排错罢。
回复

使用道具 举报

 楼主| 发表于 2004-7-25 14:59:28 | 显示全部楼层
应该是
char *get_perms(struct stat *sbuf,char *perms)
函数有问题,我搞不清楚以下语句
j=(sbuf->st_mode>>(i*3))&07;
中>>的用法,还有最后&07是什么意思呢?
回复

使用道具 举报

发表于 2004-7-25 15:07:46 | 显示全部楼层
>>是位移操作,&是按位与操作。
回复

使用道具 举报

 楼主| 发表于 2004-7-25 15:20:49 | 显示全部楼层
请问这句应该如何解释?
回复

使用道具 举报

发表于 2004-7-25 15:54:06 | 显示全部楼层
[quote:4ef16b226a="bzimage"]贴出来看看[/quote]头像中的美女是谁?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 17:54 , Processed in 0.141748 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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