我正在用 rpcgen 编写一个简单的客户端-服务器计算器,但出现编译错误。这是 .x
文件 (calculadora.x
):
union resultado_calculo switch (int err)
{
case 0:
int resultado;
default:
void;
};
program CALCULADORA_PROG
{
version CALCULADORA_VER
{
resultado_calculo Suma (int, int) = 1;
resultado_calculo Resta (int, int) = 2;
resultado_calculo Producto (int, int) = 3;
resultado_calculo Cociente (int, int) = 4;
} = 1;
} = 20000001;
运行 rpcgen -NCa calculadora.x
会创建以下文件:
total 40K
drwxr-xr-x 2 groctel groctel 4.0K Mar 23 16:40 .
drwxr-xr-x 3 groctel groctel 4.0K Mar 23 16:10 ..
-rw-r--r-- 1 groctel groctel 1.3K Mar 23 16:27 calculadora_client.c
-rw-r--r-- 1 groctel groctel 1.9K Mar 23 16:22 calculadora_clnt.c
-rw-r--r-- 1 groctel groctel 1.1K Mar 23 15:56 calculadora_server.c
-rw-r--r-- 1 groctel groctel 3.5K Mar 23 16:22 calculadora_svc.c
-rw-r--r-- 1 groctel groctel 1.2K Mar 23 16:23 Makefile.calculadora
-rw-r--r-- 1 groctel groctel 2.7K Mar 23 16:22 calculadora.h
-rw-r--r-- 1 groctel groctel 348 Mar 23 16:22 calculadora.x
现在,我已经填写了客户端和服务器的模板并多次运行该程序。我必须用 make CFLAGS+="-I/usr/include/tirpc -ltirpc" -f Makefile.calculadora
编译以包含我系统的 rpc 库,但那里没有真正的问题。我也运行了几次程序,所有操作都运行良好(例如,./calculadora 3 + 2
返回 5
)。
但是,我今天再次访问了 make
程序,得到以下输出:
➜ make CFLAGS+="-I/usr/include/tirpc -ltirpc" -f Makefile.calculadora
rpcgen calculadora.x
resultado_calculo Suma (int, int) = 1;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
calculadora.x, line 13: only one argument is allowed
make: *** [Makefile.calculadora:32: calculadora_xdr.c] Error 1
我不明白为什么这个错误现在出现而不是以前出现,因为程序昨天运行得很好。这是我正在编译的 Suma
函数:
resultado_calculo *
suma_1_svc(int arg1, int arg2, struct svc_req *rqstp)
{
static resultado_calculo result;
xdr_free(xdr_resultado_calculo, &result);
result.resultado_calculo_u.resultado = arg1 + arg2;
return &result;
}
其他函数完全相同,但运算符不同(-
、*
和 /
)。我做错了什么?
答案 0 :(得分:1)
您需要使用 -N
选项来允许多个参数。来自documentation:
-N
使用 rpcgen 的新风格。这允许过程具有多个参数。它还使用与 C 非常相似的参数传递风格。因此,当将参数传递给远程过程时,您不必传递指向参数的指针,而是传递参数本身。此行为与 rpcgen 生成代码的旧式不同。由于向后兼容,newstyle 不是默认情况。
在此功能之前,您传递多个参数的方式是将它们打包到一个结构中并传递一个指向该结构的指针。