当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : gcc编译时出现的undefined reference to问题。
帖子发表于 : 2010-01-24 16:29 
头像

注册: 2009-08-14 16:24
帖子: 314
送出感谢: 0 次
接收感谢: 0 次
代码:
lucifer@DearBaby:~/CC/Unix$ gcc 4-7.c
/tmp/ccmJEixS.o: In function `myftw':
4-7.c:(.text+0x8a6): undefined reference to `path_alloc'
collect2: ld returned 1 exit status
lucifer@DearBaby:~/CC/Unix$ gcc 4-7.c -lpthrea
/usr/bin/ld: cannot find -lpthrea
collect2: ld returned 1 exit status
lucifer@DearBaby:~/CC/Unix$

不知什么意思?
源代码贴这里啦,有兴趣的看看咯,估计也看不下去。。嘻嘻。,能够告诉我到底怎么出问题了或许就好解决了,最好能够提供解决办法拉~
代码:
#include "apue.h"
#include <dirent.h>
#include <limits.h>

//function type that is called for each filename
typedef int Myfunc(const char *, const struct stat *, int);
static/*全局变量*/ Myfunc/*上面 typedef定义的类型*/ myfunc;
static int myftw(char *, Myfunc*);
static int dopath(Myfunc *);

static long nreg, ndir, nblk, nchr, nfifo, nslink, nsock, ntot;

int main(int argc, char *argv[])
{
   int ret;

   if(argc!=2)
      err_quit("usage:ftw <starting-pathname>");

   ret = myftw(argv[1],myfunc);//does it all

   ntot = nreg + ndir + nblk + nchr + nfifo + nslink + nsock;
   if(ntot == 0)
      ntot=1;//avoid divide by 0; printf 0 for all counts
   printf("regular files  = %7ld, %5.2f %%\n", nreg, nreg*     100.0/ntot);
   printf("directories    = %7ld, %5.2f %%\n", ndir, ndir*     100.0/ntot);
   printf("block special  = %7ld, %5.2f %%\n", nblk, nblk*     100.0/ntot);
   printf("char special   = %7ld, %5.2f %%\n", nchr, nchr*     100.0/ntot);
   printf("FIFOs          = %7ld, %5.2f %%\n", nfifo, nfifo*   100.0/ntot);
   printf("symbolic links = %7ld, %5.2f %%\n", nslink, nslink* 100.0/ntot);
   printf("sockets        = %7ld, %5.2f %%\n", nsock, nsock*   100.0/ntot);
   exit(ret);
}

/*
 *Descend through the hierarchy, strting at "pathname".
 *The caller's func() is called for every file.
 */
#define FTW_F 1 //文件,除了目录
#define FTW_D 2 //directory
#define FTW_DNR 3 //directory that can't be read
#define FTW_NS 4 //file that we can't stat不能取得状态的文件

static char *fullpath; //contains目录(包含) full pathname(路径) for every file

static int myftw(char *pathname, Myfunc *func)
{
   int len;
   fullpath = path_alloc(&len);//malloc's for PATH_MAX+1 byees (Figure 2.15)
   strncpy(fullpath, pathname, len);//protect against
    //strncpy()将参数pathname字符串的前len个字符复制到fullpath所指向的地址
   fullpath[len-1] = 0;//buffer overrun缓冲区越界

   return(dopath(func));
}
/*
 *降序遍历目录,开始于"fullpath(完整路径)".
 *如果"fullpath(完整路径)"是一些东西区别于目录,我们用lstat()取得文件的状态,调用func(),然后返回。
 *为了一个目录,我们调用自己递归地为了每一个名字在目录里。
 */
static int dopath(Myfunc * func)//我们返回func()的返回值
{
   struct stat statbuf;
   struct dirent *dirp;
   DIR *dp;
   int ret;
   char *ptr;

   if(lstat(fullpath, &statbuf)< 0)//取得文件状态出错
      return(func(fullpath, &statbuf, FTW_NS));
   if(S_ISDIR(statbuf.st_mode) == 0)//如果不是目录
      return(func(fullpath, &statbuf, FTW_F));

   /*
    *如果是一个目录,首先调用func()为了这个目录,然后处理每一个文件名在目录里的
    */
   if((ret = func(fullpath, &statbuf, FTW_D))!=0)
      return(ret);

   ptr = fullpath + strlen(fullpath);//指向完整路径的末尾
   *ptr++ = '/';
   *ptr = 0;

   if((dp = opendir(fullpath)) == NULL)
      return(func(fullpath, &statbuf, FTW_DNR));//如果不能读取目录

   while((dirp = readdir(dp)) != NULL)
   {
      if(strcmp(dirp->d_name, ".")==0||strcmp(dirp->d_name, ".."))
         continue;//忽略"."和".."

      strcpy(ptr, dirp->d_name);//在名字后面附加斜杠

      if(ret = dopath(func) != 0)//循环的
            break;//是时候离开了
   }
   ptr[-1]=0;//抹掉所有的在斜杠前的东西

   if(closedir(dp) < 0)
      err_ret("can't close directory %s", fullpath);

   return(ret);
}

static int myfunc(const char *pathname, const struct stat *statptr, int type)
{
   switch(type)
   {
      case FTW_F:
         switch(statptr->st_mode & S_IFMT)
         {
            case S_IFREG:  nreg++;   break;
            case S_IFBLK:  nblk++;   break;
            case S_IFCHR:  nchr++;   break;
            case S_IFIFO:  nfifo++;  break;
            case S_IFLNK:  nslink++; break;
            case S_IFSOCK: nsock++;  break;
            case S_IFDIR:
                        err_dump("For S_IFDIR for %s", pathname);
                        //目录应该有类型为FTW_D
         }
         break;
      case FTW_D:
         ndir++;
         break;
      
      case FTW_DNR:
         err_ret("不能读取目录 %s", pathname);

      case FTW_NS:
         err_ret("取得\"%s\"文件状态失败", pathname);

      default:
         err_dump("Unknown type %d for pathname %s", type, pathname);
   }
   return(0);
}

apue.h:
代码:
#include "apue1.h"
#include <errno.h>      /* for definition of errno */
#include <stdarg.h>     /* ISO C variable aruments */

static void err_doit(int, int, const char *, va_list);

/*
 * Nonfatal error related to a system call.
 * Print a message and return.
 */
void
err_ret(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
}

/*
 * Fatal error related to a system call.
 * Print a message and terminate.
 */
void
err_sys(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    exit(1);
}

/*
 * Fatal error unrelated to a system call.
 * Error code passed as explict parameter.
 * Print a message and terminate.
 */
void
err_exit(int error, const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, error, fmt, ap);
    va_end(ap);
    exit(1);
}

/*
 * Fatal error related to a system call.
 * Print a message, dump core, and terminate.
 */
void
err_dump(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(1, errno, fmt, ap);
    va_end(ap);
    abort();        /* dump core and terminate */
    exit(1);        /* shouldn't get here */
}

/*
 * Nonfatal error unrelated to a system call.
 * Print a message and return.
 */
void
err_msg(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(0, 0, fmt, ap);
    va_end(ap);
}

/*
 * Fatal error unrelated to a system call.
 * Print a message and terminate.
 */
void
err_quit(const char *fmt, ...)
{
    va_list     ap;

    va_start(ap, fmt);
    err_doit(0, 0, fmt, ap);
    va_end(ap);
    exit(1);
}

/*
 * Print a message and return to caller.
 * Caller specifies "errnoflag".
 */
static void
err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
    char    buf[MAXLINE];
   vsnprintf(buf, MAXLINE, fmt, ap);
   if (errnoflag)
       snprintf(buf+strlen(buf), MAXLINE-strlen(buf), ": %s\n",
         strerror(error));
   strcat(buf, "");
   fflush(stdout);     /* in case stdout and stderr are the same */
   fputs(buf, stderr);
   fflush(NULL);       /* flushes all stdio output streams */
}

apue1.h
代码:
#ifndef _APUE_H
#define _APUE_H

#define _XOPEN_SOURCE 600//Single UNIX Specification, Version 3

#include <sys/types.h>//Some systems still require this
#include <sys/stat.h>
#include <sys/termios.h>//for winsize
#ifndef TIOCGWINSZ
#include <sys/ioctl.h>
#endif
#include <stdio.h>//For convenience
#include <stdlib.h>//For convenience
#include <stddef.h>//For offsetof
#include <string.h>//For convenience
#include <unistd.h>//For convenience
#define MAXLINE 4096//Max line length
/*
 *Default file access permissions for new files.
 */
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
/*
 *Default permissions for new directories.
 */
#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
typedef void  Sigfunc(int);//For signal handlers

#if defined(SIG_IGN) && !defined(SIG_ERR)
#define SIG_ERR((Sigfunc *)-1)

#endif

#define min(a,b) ((a)<(b) ? (a) : (b))
#define max(a,b) ((a)>(b) ? (a) : (b))

/*
 *Prototypes for our own functions
 */
char *path_alloc(int *);
long open_max(void);
void set_fl(int, int);
void clr_fl(int, int);
void pr_exit(int);
void pr_mask(const char*);
Sigfunc *signal_intr(int, Sigfunc *);

int tty_cbreak(int);
int tty_raw(int);
int tty_reset(int);
void tty_atexit(void);
#ifdef ECHO //Only if<termios.h>has bee include
struct termios *tty_termios(void);
#endif

void sleep_us(unsigned int);
ssize_t readn(int, void *, size_t);
ssize_t writen(int, const void *, size_t);
void daemonize(const char *);

int s_pipe(int *);
int recv_fd(int, ssize_t (*func)(int, const void *, size_t));

int send_fd(int, int);
int send_err(int, int, const char*);

int serv_listen(const char*);
int serv_accept(int, uid_t*);
int cli_conn(const char*);
int buf_args(char *, int (*func)(int, char **));

int ptym_open(char *, int);
int ptys_open(char *);
#ifdef TIOCGWINSZ
pid_t pty_fork(int *, char *, int, const struct termios *,
      const struct winsize *);
#endif

int lock_reg(int, int, int, off_t, int, off_t);
#define read_lock(fd, offset, whence, len)\
      lock_reg((fd), F_SETLK, F_RDLCK, (offset), (whence), (len))
#define readw_lock(fd, offset, whence, len)\
      lock_reg((fd), F_SETLKW, F_RDLCK, (offset), (whence), (len))
#define writ_lock(fd, offset, whence, len)\
      lock_reg((fd), F_SETLK, F_WRLCK, (offset), (whence), (len))
#define writw_lock(fd, offset, whence, len)\
      lock_reg((fd), F_SETLKW, F_WRLCK, (offset), (whence), (len))
#define un_lock(fd, offset, whence, len)\lock_reg((fd), F_SETLK, F_UNLCK, (offset), (whence), (len))

pid_t lock_test(int, int, off_t, int, off_t);

#define is_read_lockable(fd, offset, whence, len)\
      (lock_test((fd), F_RDLCK, (offset), (whence), (len)) == 0)
#define is_write_lockable(fd, offset, whence, len)\
      (lock_test((fd), F_WRLCK, (offset), (whence), (len)) == 0)

void err_dump(const char *, ...);
void err_msg(const char*, ...);
void err_quit(const char*, ...);
void err_exit(int, const char *,...);
void err_ret(const char *, ... );
void err_sys(const char *, ... );

void log_msg(const char *, ... );
void log_open(const char *, int, int);
void log_quit(const char *, ... );
void log_ret(const char *, ... );
void log_sys(const char *, ...);

void TELL_WAIT(void);
void TELL_PARENT(pid_t);
void TELL_CHILD(pid_t);
void WAIT_PARENT(void);
void WAIT_CHILD(void);

#endif //_APUE_H 
:em06


_________________
我很乖的。。。


页首
 用户资料  
 
2 楼 
 文章标题 : Re: gcc编译时出现的undefined reference to问题。
帖子发表于 : 2010-01-25 0:23 
头像

注册: 2009-09-20 19:30
帖子: 765
地址: GIS
系统: ubuntu12.04
送出感谢: 0 次
接收感谢: 0 次
看了一半看不下去了。。。 :em06


页首
 用户资料  
 
3 楼 
 文章标题 : Re: gcc编译时出现的undefined reference to问题。
帖子发表于 : 2010-01-25 7:01 
头像

注册: 2009-08-14 16:24
帖子: 314
送出感谢: 0 次
接收感谢: 0 次
:em05
我也知道,要我看还看不到一半呢,如果看全部的话。

第一个源代码应该不难吧。

没看完也没关系啦,能告诉我为什么链接出错和怎么解决就可以啦~


_________________
我很乖的。。。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: gcc编译时出现的undefined reference to问题。
帖子发表于 : 2010-01-25 9:19 

注册: 2008-11-01 21:42
帖子: 1028
地址: 树下板凳
送出感谢: 0 次
接收感谢: 1
http://www.cnblogs.com/xiaoliyu/archive/2009/03/08/1406448.html
这个path_alloc的问题网上有很多啊 ,只看到你的声明,没看到实现过程 ,也不知道这个path_alloc是不是系统库中的函数,如果是,你找找所要链接的库,不是的话,按网上的自己写一个试试.
-lpthrea是-lpthread把 ,你可以查查这个库中有没这个函数的实现


_________________
民族的脊梁,是踏实做事的人,非只知道骂街的泼妇。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译