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

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

所以我有一个名为 admv2_api.cc 的 C++ 文件(当然还有 admv2_api.h)。我在其中 #include 大量从 protobuf 生成的代码。这些生成的代码与一些 message 和 gRPC service 定义相关。我在admv2_api.cc 中定义了一些API(比如.runServer()),这样不了解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相关的flags,即-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

非常感谢任何帮助!

最佳答案

经过一些尝试,在我看来这个错误

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

是 Mac 操作系统问题。我在 Linux 服务器上测试了相同的代码,它工作得很好。

关于c++ - 如何为包含 protobuf 库的 C++ 程序生成共享库 (.so) 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45889116/

相关文章:

c++ - 静态成员函数和线程安全

c++ - range-v3:奇怪的行为

java -/AndroidRuntime 致命异常 : main 03-25 11:50:16. 455

api - 如何使用 HTTP 将多张图片上传到 Flutter 中的 Rest API?

c++ - 调用弱函数符号和强函数符号?

.so 文件中的 C++ 模板化函数

在带有 VS2012/w Update 3 的 Windows 7 上构建的 C++ 程序无法在 WinXP SP3 上运行

c++ - 为什么未初始化的指针会导致接近 0 的内存访问冲突?

java - 我可以使用 Fitbit Api 获取我的 Fitbit 的加速度数据吗?

来自 Jars 的 AndroidManifest