gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:23 25 4
gpt4 key购买 nike

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

最佳答案

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

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

关于c++ - 即使库排序正确,命令行也缺少 DSO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32900288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com