CC 链接器没有给出任何错误,但生成的库未链接到 libgstvideo-1.0



我正在使用cmake来生成一个gstreamer库。最后,cmake 使用以下命令进行链接:

/usr/bin/cc -fPIC -shared -Wl,-soname,libmacq-gstmelpi.so -o libmacq-gstmelpi.so <OBJECT_FILES> -lmacq-melpi -lmacq-icar-tools -lmacq-gstmecimeta -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -lgstvideo-1.0

请注意末尾的 -lgstvideo-1.0 标志。该命令运行良好,不会产生错误,并且生成的库创建得很好。但是,当我使用该库时,我收到未定义的符号错误。所以我用ldd来检查;在LDD的所有产出中;找不到 libgstvideo-1.0.so

此问题发生在 Ubuntu 14.04 上的 armhf 架构上。opensuse 13.1 (i586) 和 opensuse 13.1 (armv7hl) 上都没有出现问题,因为在这种情况下ldd libmacq-gstmelpi.so | grep gstvideo给出:

libgstvideo-1.0.so.0 => /usr/lib/libgstvideo-1.0.so.0 (0xb715f000)

编辑:

我还有另一个库,非常相似,其中非常相似的命令工作得很好;生成的库正确链接到 libgstvideo-1.0.so

/usr/bin/cc -fPIC -shared -Wl,-soname,libmacq-gstplugins.so -o libmacq-gstplugins.so <OBJECT_FILES> -lmacq-icar-tools -lmacq-gstmecimeta -lgstapp-1.0 -lgstbase-1.0 -lgstreamer-1.0 -lgobject-2.0 -lglib-2.0 -lgstvideo-1.0

关于我检查和尝试过的一些评论:

    /
  • usr/lib/arm-linux-gnueabihf/libgstvideo-1.0.so 存在。(/usr/lib/arm-linux-gnueabihf/中的其他库没有问题,libmacq-gstmelpi.so 链接到/usr/lib/arm-linux-gnueabihf/libgstreamer-1.0.so.0 没有问题)
  • 我尝试更改顺序,并将 -lgstvideo-1.0 标志放在所有其他 -l 标志之前;没有成功。
  • cc替换为 c++gcc ;命令有效,但输出相同
  • 在构建工作的系统上删除 -LGST视频-1.0。生成的库构建(链接)没有错误;然而在执行时,我遇到了与 Ubuntu 相同的未定义符号错误。这证明缺少的符号在 libgstvideo-1.0.so,我需要它。

您实际上是使用该特定库中的符号,还是只想链接到它以避免在以后使用该库的应用程序中链接它?

这可能是

默认的编译器行为,当实际未使用库中的符号时,它会跳过库的链接。

试着-Wl,--no-as-needed你的旗帜。在这种情况下,库应该被链接 - 而不是检查它的符号是否实际使用。

编辑:聊天后发现,实际想要的符号在 gstbase-1.0 中,而不是 gstvideo-1.0 中。由于 gstvideo-1.0 将 gstbase-1.0 作为依赖项拉入,这有效,但会导致问题,因为链接器可能会删除此依赖项,因为没有使用此特定库中的符号。直接链接到gstbase-1.0似乎可以解决所有问题。

相关内容

  • 没有找到相关文章

最新更新