2012-10-30 64 views
1

我有这个简单的服务器,必须注册一个过程,使其通过RPC可用。这里是我的server.c:未定义的引用'registerrpc'

#include <rpc/rpc.h> 
int * p_double(int n){ 
    static int d; 
    d = 2 * n; 
    return &d; 
} 
int main(){ 
    registerrpc(0x22222222, 1, 1, p_double, xdr_int, xdr_int); 
    svc_run(); 
    return 0; 
} 

当我尝试编译它,我得到这些错误:

> gcc -o s server.c 
/tmp/ccd0Roxs.o: In function `main': 
server.c:(.text+0x47): undefined reference to `registerrpc' 
collect2: ld returned 1 exit status 

我从得到的是,它无法找到任何地方registerrpc或至少在rpc/rpc.h

我使用的是Ubuntu 12.04,而我班上的另一名学生通过安装portmap使它工作。所以我试着做同样的事情。不幸的是,这对任何事都没有帮助。

(我不知道,如果这这里虽然属于,抱歉)

+0

如果你有多个警告编译(加上'-Wall'的选项),它是否也会警告'registerrpc'已被隐式声明? – Arkku

+0

是的。我没有添加它,因为我认为'server.c :(。text + 0x47):对'registerrpc'的未定义引用更具表现力 –

+1

好吧,由于它是隐式声明的,所以它没有在'rpc/rpc中定义。 h'。找到正确的_header_可能会找到正确的库很长的路要走。 (或者可能该函数被弃用,并且你应该使用该头文件中的其他函数,但我不知道关于rpc。) – Arkku

回答

1

您正在使用的rpc标题未定义registerrpc函数。我相信你可能正在遵循基于另一个操作系统(或者可能是旧版本)的指南。我认为最好的解决方案是找到rpc/rpc.h中功能相同的指南。

然而,在Ubuntu上似乎可以用apt-get install libtirpc-dev安装替代RPC库,然后编译选项:

gcc -o server -I /usr/include/tirpc server.c -l tirpc 
+0

这似乎工作。谢谢 :) –

0

它看起来并不像你引用了包含registerrpc

+0

在这个链接中,他们说registerrpc属于rpc/rpc.h http: //linux.die.net/man/3/registerrpc –

+0

这是正确的,标题在那里,但标题引用的实际库不在您对gcc的调用中。如果你看下面的链接,它显示了如何链接到包含registerrpc的库http://www.network-theory.co.uk/docs/gccintro/gccintro_17.html – cowboydan

+0

我明白了。你说的是我需要链接到rpc库?你知道我能找到它吗? –

2

您需要用RPC库链接库,librpc

$ gcc -Wall -lrpc server.c -o server 
+0

它说'/ usr/bin/ld:找不到-lrpc' –

+0

你在哪里安装了RPC头和库? –

+0

其实我没有安装任何头文件。我认为他们带着操作系统。 –