You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RPC编译报错:undefined reference to 'xdr_int'等符号未定义

解决RPC编译链接错误:undefined reference to xdr_int/clnt_create等

问题场景

执行make -f Makefile.add构建RPC客户端时,出现链接错误,提示多个RPC相关函数未定义。

错误日志

cc -g     -o add_client  add_clnt.o add_client.o add_xdr.o -lnsl 
/usr/bin/ld: add_clnt.o: in function `add_1':
/home/mridu/rpc/add_clnt.c:18: undefined reference to `xdr_int'
/usr/bin/ld: /home/mridu/rpc/add_clnt.c:18: undefined reference to `xdr_int'
/usr/bin/ld: add_client.o: in function `add_prog_1':
/home/mridu/rpc/add_client.c:18: undefined reference to `clnt_create'
/usr/bin/ld: /home/mridu/rpc/add_client.c:20: undefined reference to `clnt_pcreateerror'
/usr/bin/ld: /home/mridu/rpc/add_client.c:27: undefined reference to `clnt_perror'
/usr/bin/ld: add_xdr.o: in function `xdr_numbers':
/home/mridu/rpc/add_xdr.c:13: undefined reference to `xdr_int'
/usr/bin/ld: /home/mridu/rpc/add_xdr.c:15: undefined reference to `xdr_int'
collect2: error: ld returned 1 exit status
make: *** [Makefile.add:41: add_client] Error 1

相关文件内容

Makefile.add

# This is a template Makefile generated by rpcgen

# Parameters

CLIENT = add_client
SERVER = add_server

SOURCES_CLNT.c =
SOURCES_CLNT.h =
SOURCES_SVC.c =
SOURCES_SVC.h =
SOURCES.x = add.x

TARGETS_SVC.c = add_svc.c add_server.c add_xdr.c
TARGETS_CLNT.c = add_clnt.c add_client.c add_xdr.c
TARGETS = add.h add_xdr.c add_clnt.c add_svc.c add_client.c add_server.c

OBJECTS_CLNT = $(SOURCES_CLNT.c:%.c=%.o) $(TARGETS_CLNT.c:%.c=%.o)
OBJECTS_SVC = $(SOURCES_SVC.c:%.c=%.o) $(TARGETS_SVC.c:%.c=%.o)
# Compiler flags 

CFLAGS += -g
LDLIBS += -lnsl
LIBS+= -ltirrp
QMAKE_CXXFLAGS+= -ltirpc
RPCGENFLAGS =

# Targets 

all : $(CLIENT) $(SERVER)

$(TARGETS) : $(SOURCES.x)
        rpcgen $(RPCGENFLAGS) $(SOURCES.x)

$(OBJECTS_CLNT) : $(SOURCES_CLNT.c) $(SOURCES_CLNT.h) $(TARGETS_CLNT.c)

$(OBJECTS_SVC) : $(SOURCES_SVC.c) $(SOURCES_SVC.h) $(TARGETS_SVC.c)

$(CLIENT) : $(OBJECTS_CLNT) 
        $(LINK.c) -o $(CLIENT) $(OBJECTS_CLNT) $(LDLIBS) 

$(SERVER) : $(OBJECTS_SVC)
        $(LINK.c) -o $(SERVER) $(OBJECTS_SVC) $(LDLIBS)

 clean:
        $(RM) core $(TARGETS) $(OBJECTS_CLNT) $(OBJECTS_SVC) $(CLIENT) $(SERVER)

add.x

struct numbers{
        int num1;
        int num2;
};

program ADD_PROG{
        version ADD_VER{
                int ADD( numbers )=1;
        }=1;
}=0x23456789;

用户尝试过的操作

添加了以下编译标记,但问题未解决:

LIBS+= -ltirrp
QMAKE_CXXFLAGS+= -ltirpc

解决方案

问题根源是链接阶段未正确引入RPC依赖库:

  1. 你添加的LIBS和QMAKE_CXXFLAGS变量未被Makefile的链接逻辑使用,实际链接仅调用了LDLIBS变量。
  2. 库名拼写错误:-ltirrp应为-ltirpc。

修改步骤:

  1. 删除无效的LIBS+= -ltirrp和QMAKE_CXXFLAGS+= -ltirpc行
  2. 修改LDLIBS行,添加tirpc库:
    LDLIBS += -lnsl -ltirpc
    

原因说明:现代Linux系统中,clnt_create、xdr_int等RPC核心函数已从传统的nsl库迁移到tirpc库中,必须显式指定-ltirpc才能在链接时找到这些函数。

修改完成后,重新执行make -f Makefile.add即可完成编译链接。

内容的提问来源于stack exchange,提问作者MRIDU PAWAN BARUAH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:35:32