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依赖库:
- 你添加的
LIBS和QMAKE_CXXFLAGS变量未被Makefile的链接逻辑使用,实际链接仅调用了LDLIBS变量。 - 库名拼写错误:
-ltirrp应为-ltirpc。
修改步骤:
- 删除无效的
LIBS+= -ltirrp和QMAKE_CXXFLAGS+= -ltirpc行 - 修改
LDLIBS行,添加tirpc库:LDLIBS += -lnsl -ltirpc
原因说明:现代Linux系统中,clnt_create、xdr_int等RPC核心函数已从传统的nsl库迁移到tirpc库中,必须显式指定-ltirpc才能在链接时找到这些函数。
修改完成后,重新执行make -f Makefile.add即可完成编译链接。
内容的提问来源于stack exchange,提问作者MRIDU PAWAN BARUAH
相关产品推荐
相关产品推荐

