【问题标题】:Including paths with rpcgen包含带有 rpcgen 的路径
【发布时间】:2016-11-13 19:02:43
【问题描述】:

非常简单的疑问:我正在使用rpcgen 来实现一个 RPC 服务器,该服务器在向量中应用数学函数并将其返回给客户端。因此我需要使用<math.h>。但是由于我是通过make 使用makefile 而不是使用gccg++ 来编译项目,所以我对我应该如何做到这一点感到困惑。当简单地将文件包含在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


【解决方案1】:

我刚刚在 LDLIBS 部分添加了 -lm,效果非常好。

【讨论】:

    猜你喜欢
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2012-06-11
    • 2012-03-09
    相关资源
    最近更新 更多