【发布时间】:2016-04-14 04:32:57
【问题描述】:
使用rpcgen 创建一个简单的server-client 程序。
我正在写这个.x 文件:
program REMOTE_PROG {
version MSG_RCV {
int STRLEN(string) = 1;
double SQUARE(double *) = 2;
int NUM_OF_DEV(int *) = 3;
} = 1;
} = 99;
使用rpcgen file.x 执行 -> 生成file_svc.c。
在file_svc.c文件中,由于某种原因,它会生成每个带有_svc扩展名的函数案例:
case STRLEN:
xdr_argument = xdr_wrapstring;
xdr_result = xdr_int;
local = (char *(*)()) strlen_1_svc; //<--_SVC
break;
当我在实现功能后尝试编译服务器时
int * strlen_1(char **, CLIENT *);
编译器会引发该错误:
"_strlen_1_svc", referenced from:
_remote_prog_1 in file_svc-8501b7.o
ld: symbol(s) not found for architecture x86_64
但如果我删除自动生成的 _svc 扩展,local = (char *(*)()) strlen_1; //no _svc 程序将成功编译。
为什么会这样?为什么 rpcgen 会在函数中添加 _svc 扩展,而我在删除 _svc 时做错了什么?
PS 同样的错误也适用于 square 和 num_of_dev 函数,例如仅给出 strlen。
谢谢!
【问题讨论】: