即使库排序正确,命令行也缺少 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.txt
或Makefile
?此外,您使用的编译器版本可能会有所帮助。
【参考方案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