【发布时间】:2016-11-13 19:02:43
【问题描述】:
非常简单的疑问:我正在使用rpcgen 来实现一个 RPC 服务器,该服务器在向量中应用数学函数并将其返回给客户端。因此我需要使用<math.h>。但是由于我是通过make 使用makefile 而不是使用gcc 或g++ 来编译项目,所以我对我应该如何做到这一点感到困惑。当简单地将文件包含在rpc_server.c 中并使用log(x) 函数时,我得到:
cc -g -DRPC_SVC_FG -c -o rpc_xdr.o rpc_xdr.c
cc -g -DRPC_SVC_FG -o rpc_client rpc_clnt.o rpc_client.o rpc_xdr.o -lnsl
cc -g -DRPC_SVC_FG -c -o rpc_svc.o rpc_svc.c
cc -g -DRPC_SVC_FG -c -o rpc_server.o rpc_server.c
cc -g -DRPC_SVC_FG -o rpc_server rpc_svc.o rpc_server.o rpc_xdr.o -lnsl
rpc_server.o: In function `ln_4_svc':
/home/gfrebello/Desktop/Sistemas Distribuídos/RPC/rpc_server.c:27: undefined reference to `log'
collect2: error: ld returned 1 exit status
makefile:42: recipe for target 'rpc_server' failed
make: *** [rpc_server] Error 1
这是我的生成文件:
# This is a template Makefile generated by rpcgen
# Parameters
CLIENT = rpc_client
SERVER = rpc_server
SOURCES_CLNT.c =
SOURCES_CLNT.h =
SOURCES_SVC.c =
SOURCES_SVC.h =
SOURCES.x = rpc.x
TARGETS_SVC.c = rpc_svc.c rpc_server.c rpc_xdr.c
TARGETS_CLNT.c = rpc_clnt.c rpc_client.c rpc_xdr.c
TARGETS = rpc.h rpc_xdr.c rpc_clnt.c rpc_svc.c rpc_client.c rpc_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 -DRPC_SVC_FG
LDLIBS += -lnsl
RPCGENFLAGS = -C -N
# 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)
我还想在我的最终应用程序中使用多线程(pthreads),我什至不知道是否可以使用此设置。我至少在添加库路径时会遇到同样的问题。
提前致谢。
【问题讨论】:
-
显然,您的链接器缺少一个名为
log的符号 - 它是在哪里定义的? -
它应该在我放入服务器代码的
#include <math.h>路径中定义,并在应用函数时调用。似乎添加路径是不够的,因为make在编译.ofiles 时没有考虑到它们。 -
在 Linux 和 FreeBSD 下,数学函数(在 math.h 中声明)分别捆绑在数学库 libm 中。因此,如果使用这些函数中的任何一个,则必须为链接器提供指令
-lm。 -
C 函数未在 C 头文件中定义。它们在头文件中声明,在源文件中定义 (
.c)。要使用函数,您需要链接编译定义所在的目标文件或库。您根本没有链接数学库libm。建议在继续之前研究如何编译和链接 C 程序。
标签: c multithreading makefile rpc