免费注册 查看新帖 |

Chinaunix

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

[函数] :?: 如何查找函数和成员在哪个库中间定义的 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-11-02 20:53 |只看该作者 |倒序浏览
在看前辈们写的程序的时候总是会被那些函数和成员的定义搞糊涂,不知道他们是从哪里来的,自己用就很困难,请问如何根据函数或者成员找出定义他们的库和结构呢?比如下面一段简单的程序:
#include <sys/types.h>;
#include <dirent.h>;
//#include "ourhdr.h"

int main(int argc, char *argv[]) {
        DIR *dp;
        struct dirent *dirp;
       
        if (argc != 2)
        {
                err_quit("a single argument (the directory name) is required";
        }
        if ( (dp = opendir(argv[1])) == NULL)
        {
                err_sys("can't open %s",argv[1]);
        }
        while ( (dirp = readdir(dp)) != NULL)
        {
                printf ("%s\n", dirp->;d_name);
        }
        closedir(dp);
        exit (0);
}
err_quit()和err_sys()我就是找不到。对于一般的函数,我使用man来查找定义的类库的,实在不行就用grep /usr/include/*。可这样毕竟很麻烦,而且经常找不到,请问大虾们一般都是怎么做的阿?大家给点意见吧。谢谢!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-11-02 22:10 |只看该作者

:?: 如何查找函数和成员在哪个库中间定义的

[qu        while ( (dirp = readdir(dp)) != NULL)
        {ote="rubemars"]

                printf ("%s\n", dirp->;d_name);
        }
        closedir(dp);
        exit (0);
}
err_quit()和err_sys()我就是找不到。对于一般的函数,我使用man来查找定义的类库的,实..........[/quote]
你看到
  1. #include "ourhdr.h"
复制代码
这个了吗?你所说的找不到的就在这个头文件里面定义的。
你看的是APUE吧,作者说得很清楚呀,你看书不仔细了。

论坛徽章:
0
3 [报告]
发表于 2003-11-02 22:59 |只看该作者

:?: 如何查找函数和成员在哪个库中间定义的

我看的是《UNIX环境高级编程》,是我没看仔细,那个函数在附录上面有,很多书都这样。可是我只是举个例子,这并不是问题的关键所在啊,面对C的那么多头文件我始终不知所措,希望你能指点一下怎么理清思路,谢谢!

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

:?: 如何查找函数和成员在哪个库中间定义的

[quote]原帖由 "rubemars"]我看的是《UNIX环境高级编程》,是我没看仔细,那个函数在附录上面有,很多书都这样。可是我只是举个例子,这并不是问题的关键所在啊,面对C的那么多头文件我始终不知所措,希望你能指点一下怎么理清思路,谢谢![/quote 发表:

不知道的就用googel搜呀。给你一个连接,不知对你有没有用。
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/

论坛徽章:
0
5 [报告]
发表于 2003-11-03 09:05 |只看该作者

:?: 如何查找函数和成员在哪个库中间定义的

老大,那是书里自己定义的函数,在书的附录里可以找到:)

论坛徽章:
0
6 [报告]
发表于 2003-11-03 10:21 |只看该作者

:?: 如何查找函数和成员在哪个库中间定义的

谢谢各位了。

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

:?: 如何查找函数和成员在哪个库中间定义的

办法很多的。unix提供了组建函数关系的命令,一般的找不到的是一些用户自定义的库函数。当然,在windows上,SSight也是个不错的工具

论坛徽章:
0
8 [报告]
发表于 2003-11-03 13:35 |只看该作者

:?: 如何查找函数和成员在哪个库中间定义的

unix提供了组建函数关系的命令,斑竹能具体说说么?

论坛徽章:
0
9 [报告]
发表于 2003-11-03 13:40 |只看该作者

:?: 如何查找函数和成员在哪个库中间定义的

现在是这样的:有三个文件,其中一个是头文件,一个是定义头文件中的申明的函数,还有一个就是主函数文件,如何建立一个工程然后编译?代码如下:
主函数文件:
#include <sys/types.h>;
#include <dirent.h>;
#include "ourhdr.h"

int main(int argc, char *argv[]) {
        DIR *dp;
        struct dirent *dirp;
       
        if (argc != 2)
        {
                err_quit("a single argument (the directory name) is required";
        }
        if ( (dp = opendir(argv[1])) == NULL)
        {
                err_sys("can't open %s",argv[1]);
        }
        while ( (dirp = readdir(dp)) != NULL)
        {
                printf ("%s\n", dirp->;d_name);
        }
        closedir(dp);
        exit (0);
}
头文件:
/* Our own header, to be included *after* all standard system headers */

#ifndef __ourhdr_h
#define __ourhdr_h

#include    <sys/types.h>;   /* required for some of our prototypes */
#include    <stdio.h>;       /* for convenience */
#include    <stdlib.h>;      /* for convenience */
#include    <string.h>;      /* for convenience */
#include    <unistd.h>;      /* for convenience */

#define MAXLINE 4096            /* max line length */

#define FILE_MODE   (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
                    /* default file access permissions for new files */
#define DIR_MODE    (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)
                    /* default permissions for new directories */

typedef void    Sigfunc(int);   /* for signal handlers */

                    /* 4.3BSD Reno <signal.h>; doesn't define SIG_ERR */
#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 *);         /* {Prog pathalloc} */
int      open_max(void);            /* {Prog openmax} */
void     clr_fl(int, int);          /* {Prog setfl} */
void     set_fl(int, int);          /* {Prog setfl} */
void     pr_exit(int);              /* {Prog prexit} */
void     pr_mask(const char *);     /* {Prog prmask} */
Sigfunc *signal_intr(int, Sigfunc *);/* {Prog signal_intr_function} */

int      tty_cbreak(int);           /* {Prog raw} */
int      tty_raw(int);              /* {Prog raw} */
int      tty_reset(int);            /* {Prog raw} */
void     tty_atexit(void);          /* {Prog raw} */
#ifdef  ECHO    /* only if <termios.h>; has been included */
struct termios  *tty_termios(void); /* {Prog raw} */
#endif

void     sleep_us(unsigned int);    /* {Ex sleepus} */
ssize_t  readn(int, void *, size_t);/* {Prog readn} */
ssize_t  writen(int, const void *, size_t);/* {Prog writen} */
int      daemon_init(void);         /* {Prog daemoninit} */

int      s_pipe(int *);             /* {Progs svr4_spipe bsd_spipe} */
int      recv_fd(int, ssize_t (*func)(int, const void *, size_t));
                                    /* {Progs recvfd_svr4 recvfd_43bsd} */
int      send_fd(int, int);         /* {Progs sendfd_svr4 sendfd_43bsd} */
int      send_err(int, int, const char *);/* {Prog senderr} */
int      serv_listen(const char *); /* {Progs servlisten_svr4 servlisten_44bsd} */
int      serv_accept(int, uid_t *); /* {Progs servaccept_svr4 servaccept_44bsd} */
int      cli_conn(const char *);    /* {Progs cliconn_svr4 cliconn_44bsd} */
int      buf_args(char *, int (*func)(int, char **));
                                    /* {Prog bufargs} */

int      ptym_open(char *);         /* {Progs ptyopen_svr4 ptyopen_44bsd} */
int      ptys_open(int, char *);    /* {Progs ptyopen_svr4 ptyopen_44bsd} */
#ifdef  TIOCGWINSZ
pid_t    pty_fork(int *, char *, const struct termios *,
                  const struct winsize *);  /* {Prog ptyfork} */
#endif

int     lock_reg(int, int, int, off_t, int, off_t);
                                    /* {Prog lockreg} */
#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 write_lock(fd, offset, whence, len) \
            lock_reg(fd, F_SETLK, F_WRLCK, offset, whence, len)
#define writew_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);
                                    /* {Prog locktest} */

#define is_readlock(fd, offset, whence, len) \
            lock_test(fd, F_RDLCK, offset, whence, len)
#define is_writelock(fd, offset, whence, len) \
            lock_test(fd, F_WRLCK, offset, whence, len)

void    err_dump(const char *, ...);    /* {App misc_source} */
void    err_msg(const char *, ...);
void    err_quit(const char *, ...);
void    err_ret(const char *, ...);
void    err_sys(const char *, ...);

void    log_msg(const char *, ...);     /* {App misc_source} */
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);        /* parent/child from {Sec race_conditions} */
void    TELL_PARENT(pid_t);
void    TELL_CHILD(pid_t);
void    WAIT_PARENT(void);
void    WAIT_CHILD(void);

#endif  /* __ourhdr_h */

头文件函数的定义:
#include        <errno.h>;                /* for definition of errno */
#include        <stdarg.h>;                /* ANSI C header file */
#include        "ourhdr.h"

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

char        *pname = NULL;                /* caller can set this from argv[0] */

/* 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, fmt, ap);
        va_end(ap);
        return;
}

/* 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, 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, 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, fmt, ap);
        va_end(ap);
        return;
}

/* 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, fmt, ap);
        va_end(ap);
        exit(1);
}

/* Print a message and return to caller.
* Caller specifies "errnoflag". */

static void
err_doit(int errnoflag, const char *fmt, va_list ap)
{
        int                errno_save;
        char        buf[MAXLINE];

        errno_save = errno;                /* value caller might want printed */
        vsprintf(buf, fmt, ap);
        if (errnoflag)
                sprintf(buf+strlen(buf), ": %s", strerror(errno_save));
        strcat(buf, "\n";
        fflush(stdout);                /* in case stdout and stderr are the same */
        fputs(buf, stderr);
        fflush(stderr);                /* SunOS 4.1.* doesn't grok NULL argument */
        return;
}

论坛徽章:
0
10 [报告]
发表于 2003-11-03 18:01 |只看该作者

:?: 如何查找函数和成员在哪个库中间定义的

su find / -name '*.so' -exec grep -l "the unknown symbol" {} \;
su find / -name '*.h' -exec grep -l "the unknown symbol" {} \;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP