如何为包含 protobuf 库的 C++ 程序生成共享库 (.so) 文件
How to generate shared library(.so) file for a C++ program that contains protobuf library
所以我有一个名为 admv2_api.cc
的 C++ 文件(当然还有 admv2_api.h
)。我在其中 #include
大量从 protobuf 生成的代码。这些生成的代码与一些 message
和 gRPC service
定义相关。我在admv2_api.cc
中定义了一些API(如.runServer()
),这样不了解gRPC细节的人仍然可以使用它来设置服务器和发送消息等。
现在我想为 admv2_api.cc
生成一个 .so 文件,这样人们就可以 link 他们的程序针对这个 .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
非常感谢任何帮助!
经过一些尝试,在我看来这个错误
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 服务器上测试了相同的代码,它工作得很好。
所以我有一个名为 admv2_api.cc
的 C++ 文件(当然还有 admv2_api.h
)。我在其中 #include
大量从 protobuf 生成的代码。这些生成的代码与一些 message
和 gRPC service
定义相关。我在admv2_api.cc
中定义了一些API(如.runServer()
),这样不了解gRPC细节的人仍然可以使用它来设置服务器和发送消息等。
现在我想为 admv2_api.cc
生成一个 .so 文件,这样人们就可以 link 他们的程序针对这个 .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
非常感谢任何帮助!
经过一些尝试,在我看来这个错误
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 服务器上测试了相同的代码,它工作得很好。