【发布时间】: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?此外,您使用的编译器版本可能会有所帮助。