我遇到了令人难以置信的令人沮丧的链接器问题。我有两个动态.so
库,一个定义gpr_log
(称为libgpr.so
),另一个定义它(称为libgrpc++.so
)。
我正在尝试链接像这样的可执行文件:
/usr/bin/c++
my_obj_file.o
-o my_exec
-rdynamic
lib1.a
lib2.so
libgpr.so
libgrpc++.so
输出:
/usr/bin/ld: libgrpc++.so: undefined reference to symbol `gpr_log`
libgpr.so: error adding symbols: DSO missing from command line
以下是您要跳入的部分,并告诉我libgpr.so
之后需要提供libgrpc.so
。当然,我预料到了这一点并交换了两个参数的顺序,只是遇到了同样的问题:
/usr/bin/c++
my_obj_file.o
-o my_exec
-rdynamic
lib1.a
lib2.so
libgrpc++.so
libgpr.so
我已根据需要传入动态库,为什么没有看到那里定义的符号?另外,我正在使用CMake生成此编译命令,这个问题似乎只影响这个目标。是什么给了什么?
答案 0 :(得分:3)
当我尝试测试grpc gRPC in 3 minutes C++的基本版本时,我遇到了同样的问题。我开始使用新的ubuntu,因此我必须安装所有依赖项和库。它最终输出与上面相同的输出。
我试着看看是否在任何地方使用了log_gpr,并且在示例的源代码中找不到它。然后我调查了安装的库:
cd /usr/local/lib
readelf -s libgrpc++.so | grep gpr_log
138: 0000000000000000 0 FUNC GLOBAL DEFAULT UND gpr_log
有一个对函数的引用,但指针似乎未定义。来自libgrpc.so的类似输出产生于:
readelf -s libgrpc.so | grep gpr_log
394: 0000000000081810 88 FUNC GLOBAL DEFAULT 11 gpr_log_severity_string
823: 00000000000818c0 153 FUNC GLOBAL DEFAULT 11 gpr_log_verbosity_init
956: 0000000000081970 199 FUNC GLOBAL DEFAULT 11 gpr_log
1065: 0000000000081870 51 FUNC GLOBAL DEFAULT 11 gpr_log_messagee here
所以gpr_log是在libgrpc中定义的,而不是在libgrpc ++中定义的。 现在是时候检查Makefile了:
.../grpc/examples/cpp/helloworld/Makefile
LDFLAGS += -L/usr/local/lib `pkg-config --libs grpc++` -lprotobuf -lpthread -ldl
为了使其工作,我将libgrpc添加到Makefile中的LDFLAGS:
LDFLAGS += -L/usr/local/lib `pkg-config --libs grpc++` -lprotobuf -lpthread -ldl -lgrpc
然后编译很顺利,我可以运行示例