免费注册 查看新帖 |

Chinaunix

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

求救: undefined reference to bpfree bpinit "用TCP/IP进行网际互联 rtp实例 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-06 20:21 |只看该作者 |倒序浏览
我正在学习"用TCP/IP进行网际互联 第三卷"
rtp实现实例中编译时遇到问题: undefined reference to bpfree
undefined reference to bpinit
undefined reference to bpget
头文件util.h中有bpfree,bpinit,bpget的说明,
我也下载了作者的原程序,仔细检查了,也用diff比较了,

用 nm -o /lib/*.so | grep bpfree 检查显示:
nm: /lib/libcal.so 无符号
nm: /lib/libattr.so 无符号


到底是什么问题,请高手帮忙.
----------------
文件util.h中如下:
/* util.h - tv2lin */
#include "common.h"
#define tv2lin(t, clkrt) ((t.tv_sec * clkrt) + ((int) ((double) t.tv_usec * .000001 * (double) clkrt)))
struct bufpool {
char *bp_next; /* pointer to next free buffer */
sem_t bp_sem; /* counting semaphore */
pthread_mutex_t bp_mutex; /* lock for list manipulation */
};
void bpinit(void);
char *bpget(void);
void bpfree(void *);
extern struct bufpool bp;
-------------------------
文件common.h如下:
/* common.h */

#ifndef COMMON_H
#define COMMON_H
#include <arpa/inet.h>
#include <fcntl.h>
#include <linux/soundcard.h>
#include <math.h>
#include <netinet/in.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>

typedef char bool;
#define TRUE 1
#define FALSE 0
#define OK 0
#define ERROR -1
#define min(a, b) (a < b ? a : b)
#define max(a, b) (a > b ? a : b)
#endif
----------------------------------
文件rtp.h 如下:
/* rtp.h - rtptsgt, rtptsmax, rtphdrlen, rtpdata */

#include "common.h"
#include "util.h"

typedef unsigned int ssrc_t;
typedef unsigned int mediatime_t;
typedef unsigned short seq_t;

#define RTP_TSWINDOW (1 << 31)
#define RTP_CURRVERS 2 /* RTP current version */
#define RTP_MINHDRLEN 12 /* RTP minimum header length */
#define RTP_MINSEQUENTIAL 2 /* sequential packets required */
#define RTP_JITTHRESH 8000 /* jitter buffer `K' (in 1/8000 sec) */
#define RTP_BPBUFSZ 2048 /* buffer pool buffer size */
#define RTP_BPBUFCNT 64 /* buffers in buffer pool */
#define RTP_LEEWAY 400 /* playback leeway (in 1/8000 sec) */
#define RTP_INACTTHRESH 5 /* number of cycles until timeout */
#define PCMMU_ID 0 /* RTP ID for PCM mu-law */
#define PCMMU_CLKRT 8000 /* PCM clockrate */
#define PCMMU_BW 64000 /* PCM bandwidth (bits/sec) */
#define rtptsgt(x, y) (x>y? (x-y<RTP_TSWINDOW?TRUE: FALSE) :
(y-x< RTP_TSWINDOW ? FALSE : TRUE))
#define rtptsmax(x, y) (rtptsgt(x, y) ? x : y)
#define rtphdrlen(prtp) (RTP_MINHDRLEN + (prtp->rtp_cc * 4))
#define rtpdata(prtp) ((char *) prtp + rtphdrlen(prtp) )
# define TIMEVAL_TO_TIMESPEC(tv, ts) {  (ts)->tv_sec = (tv)->tv_sec;
(ts)->tv_nsec = (tv)->tv_usec * 1000;  }
struct rtp {
unsigned int rtp_cc:4; /* source count */
unsigned int rtp_ext:1; /* extension flag */
unsigned int rtp_pad:1; /* padding flag */
unsigned int rtp_ver:2; /* version */
unsigned int rtp_payload:7; /* payload type */
unsigned int rtp_mark:1; /* marker flag */
seq_t rtp_seq; /* sequence number */
mediatime_t rtp_time; /* timestamp */
ssrc_t rtp_ssrc; /* synchronization source identifier*/
char rtp_data[1]; /* beginning of RTP data */
};

struct rtpln {
int rln_len; /* total length of packet */
unsigned int rln_seq; /* extended sequence number */
struct rtpln *rln_next; /* pkt with next lower sequence number*/
struct rtpln *rln_prev; /* pkt with next greater seq number */
struct rtp rln_rtp; /* RTP packet */
};

struct stream {
ssrc_t stm_ssrc; /* synchronization source identifier */
struct rtpln *stm_qhead; /* pointer to pkt with lowest seq num */
struct rtpln *stm_qtail; /* pointer to pkt with highest seq num */
pthread_mutex_t stm_qmutex; /* mutex to lock queue */
pthread_cond_t stm_rcond; /* cond var for blocking read */
pthread_mutex_t stm_rmutex; /* mutex associated read cond var */
pthread_mutex_t stm_smutex; /* mutex for locking stream structure */
bool stm_buffering; /* TRUE when stream is still buffering*/
struct timeval stm_clkx; /* local time stamp */
mediatime_t stm_clky; /* equivalent media time stamp */
double stm_jitter; /* jitter measure */
int stm_inactive; /* number of inactive cycles or status*/
int stm_packets; /* cumulative packets received */
int stm_probation; /* sequential pkts to validate stream */
seq_t stm_firstseq; /* first sequence number received */
seq_t stm_hiseq; /* greatest seq number recently recvd */
int stm_badseq; /* bad sequence number */
int stm_roll; /* sequence space ``roll-overs'' */
int stm_recprior; /* packets recv'd in last RTCP cycle */
int stm_expprior; /* packets expected in last RTCP cycle*/
mediatime_t stm_lastts; /* last ts for jitter compuataion */
struct timeval stm_lastrec; /* time last pkt rcvd for jitter comp */
unsigned int stm_ntp[2]; /* NTP timestamp of last SR (frac,int ) */
struct timeval stm_lastsr; /* local time last SR received */
};
struct session {
unsigned int sn_ssrc; /* local SSRC */
int sn_rtpfd; /* file descriptor for RTP */
int sn_rtcpfd; /* file descriptor for RTCP */
struct sockaddr_in sn_rtcpto; /* destination for RTCP packets */
struct stream sn_stream; /* single stream being received */
bool sn_detected; /* TRUE once stream detected */
int sn_avgrtcp; /* RTCP len for interval computation */
};
void rtpinit(unsigned int, int);
void rtprecv(void);
int rtpupdate(struct rtp *);
void rtpinitseq(seq_t);
int rtpupdateseq(seq_t);
void rtpnewdata(void);
bool rtpqinsert(struct rtpln *);
struct rtpln *rtpqdequeue(void);
void playaudio(void);

extern struct session sn;
extern struct stream stm;
----------------------------
文件rtcp.h如下:

/* rtcp.h - hton24 */
#include "rtp.h"
#define RTCP_HEADERLEN 4 /* RTCP header length (octest) */
#define RTCP_BWFRAC .05 /* fraction of b/w for RTCP */
#define RTCP_TTL 16 /* TTL for our RTCP packets */
#define RTCP_MAXPACKETSZ 1024 /* RTCP receive buffer size */
#define RTCP_SR 200 /* RTCP value for sender report */
#define RTCP_RR 201 /* RTCP value for receive report */
#define RTCP_BYE 203 /* RTCP value for bye message */
#define hton24(v) (((v&0xff) << 16) | (v&0xff00) | ((v&0xff0000) >>16))
struct rtcp {
unsigned int rtcp_count:5; /* object count */
unsigned int rtcp_pad:1; /* padding present flag */
unsigned int rtcp_ver:2; /* version */
unsigned char rtcp_type; /* message type */
unsigned short rtcp_length; /* message length /4 -1 */
char rtcp_data[1]; /* message data */
};
struct rblock {
ssrc_t rb_ssrc; /* SSRC to which this rblock refers */
unsigned int rb_fraclost:8; /* fraction lost since prev report */
int rb_cumlost:24; /* cumullative packets lost */
unsigned int rb_hiseq; /* extended highest seq received */
unsigned int rb_jitter; /* jitter measure */
unsigned int rb_lastsrts; /* middle 32 bits of last SR's NTP */
unsigned int rb_delay; /* delay since last SR */
};
struct rr {
ssrc_t rr_ssrc; /* SSRC of sender */
char rr_rblock[1]; /* pointer to first report block */
};
struct sr {
ssrc_t sr_ssrc; /* SSRC of sender */
unsigned int sr_intts; /* NTP timestamp (high 32 bits) */
unsigned int sr_fracts; /* NTP timestamp (low 32 bits) */
unsigned int sr_rtpts; /* RTP media timestamp */
unsigned int sr_packets; /* sender's sent packet count */
unsigned int sr_octets; /* sender's sent octet count */
char sr_rblock[1]; /* pointer to first report block */
};
void rtcpsendbye(void);
void rtcpheader(struct rtcp *, int, unsigned char, int);
double rtcpinterval(int, int, double, int, int, int *, int);
void rtcpcycle(void);
void rtcprecv(void);

论坛徽章:
0
2 [报告]
发表于 2005-12-11 18:39 |只看该作者
只有声明没有实现 肯定是出这个错的。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP