首页 > 解决方案 > rpcgen only one argument is allowed 错误

问题描述

我正在用 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;
}

-其他功能与不同的运算符(*和)完全相同/。我究竟做错了什么?

标签: cmakefilerpc

解决方案


您需要使用该-N选项来允许多个参数。从文档中:

-N
使用新样式的 rpcgen。这允许过程有多个参数。它还使用与 C 非常相似的参数传递风格。因此,在将参数传递给远程过程时,您不必传递指向参数的指针,而是传递参数本身。此行为与 rpcgen 生成代码的旧样式不同。由于向后兼容,newstyle 不是默认情况。

在此功能之前,您传递多个参数的方式是将它们打包到一个结构中并传递一个指向该结构的指针。


推荐阅读