2012-10-30 57 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

其實我沒有安裝任何頭文件。我認爲他們帶着操作系統。 –