如何为包含protobuf库的C ++程序生成共享库(.so)文件

时间:2017-08-25 20:40:55

标签: c++ api shared-libraries protocol-buffers grpc

所以我有一个名为admv2_api.cc的C ++文件(当然还有admv2_api.h)。在其中我#include生成了许多来自protobuf的代码。这些生成的代码与某些message和gRPC service定义相关。我在.runServer()中定义了一些API(例如admv2_api.cc),以便不了解gRPC细节的人仍然可以使用它来设置服务器和发送消息等。

现在我想为admv2_api.cc生成一个.so文件,以便人们只需将他们的程序链接到这个.so文件,并使用我在admv2_api.cc中定义的API。有关如何做到这一点的任何见解?

我的文件的完整树在这里:

admv2_api.cc
    -- #includes transport.grpc.pb.cc(generated file, contains definition of message and service)
    -- #includes UX.grpc.pb.cc(generated file, contains definition of message)

我做过一次尝试:

生成.so文件:

admv2_api.so: $(OBJS_GRPCS) $(OBJS_CCS) admv2_api.o
    g++ -std=c++11 $^ $(LDFLAGS) -fPIC -shared -o $@
%.o: %.cc
    g++ -std=c++11 $< -c -fPIC -o $@ 

$(OBJS_GRPCS)只是transport.grpc.pb.o UX.grpc.pb.o$(OBJS_CCS)transport.pb.o UX.pb.o$(LDFLAGS)是与grpc/protobuf相关的标记,即-L/usr/local/lib 'pkg-config --libs grpc++' -lgrpc++_reflection -lprotobuf -lpthread

然后我将admv2_api.so重命名为libadmv2_api.so并将其放入/usr/lib

然后我写了一个名为main.cc的简单测试程序。编译它:

g++ -std=c++11 main.cc -I /path/to/admv2_api.h/ -ladmv2_api -L/usr/local/lib `pkg-config --libs grpc++` -lgrpc++_reflection -lprotobuf -lpthread -ldl -o main

编译时没有错误。但是,当我运行./main时,它出现以下错误:

dyld: Library not loaded: admv2_api.so
  Referenced from: /Users/some/path/so-test/main/./main
  Reason: image not found
Abort trap: 6

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

经过一番尝试后,我觉得这个错误

dyld: Library not loaded: admv2_api.so
  Referenced from: /Users/some/path/so-test/main/./main
  Reason: image not found
Abort trap: 6

是Mac OS问题。我在linux服务器上测试了相同的代码,它运行得很好。