即使库排序正确,命令行也缺少 DSO

Posted

技术标签:

【中文标题】即使库排序正确,命令行也缺少 DSO【英文标题】:DSO missing from commandline even with proper library ordering 【发布时间】:2015-10-02 03:48:12 【问题描述】:

我遇到了一个非常令人沮丧的链接器问题。我有两个动态的.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 生成这个编译命令,这个问题似乎只影响这个目标。什么给了?

【问题讨论】:

libgrpc++.so 创建时是否与libgpr.so 关联? 我将如何找到它?当我说ldd libgrpc++.so 时,我看到libgpr.so 已列出。 嗯,类似的结构对我有用。你可以准备MCVE,它包括所有库和可执行文件的源文件,以及用于构建它们的CMakeLists.txtMakefile?此外,您使用的编译器版本可能会有所帮助。 【参考方案1】:

当我尝试测试 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

为了让它工作,我在 Makefile 中将 libgrpc 添加到 LDFLAGS:

LDFLAGS += -L/usr/local/lib `pkg-config --libs grpc++` -lprotobuf -lpthread -ldl -lgrpc

然后编译顺利,我可以运行示例

【讨论】:

以上是关于即使库排序正确,命令行也缺少 DSO的主要内容,如果未能解决你的问题,请参考以下文章

GLEW + cmake 链接失败“未定义对符号 glDrawElements 的引用”+“命令行中缺少 DSO”

//usr/lib/x86_64-linux-gnu/libcrypto.so.1.1:添加符号时出错:命令行中缺少 DSO

即使在对值进行排序后,python 行也会向后移动

如何仅通过命令行使用 TumbleWeed 安全传输

gcc命令行中静态库的cpptask排序

在命令行中正确链接库