即使使用正确的库顺序,DSO也会从命令行中丢失

时间:2015-10-02 03:48:13

标签: c++ linker cmake

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

1 个答案:

答案 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

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