【问题标题】:cc linker gives no error, but the resulting library is not linked to libgstvideo-1.0cc 链接器没有给出错误,但生成的库未链接到 libgstvideo-1.0
【发布时间】:2016-06-16 23:57:37
【问题描述】:

我正在使用 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 标志。该命令运行正常,没有产生错误,并且生成的库创建得很好。但是,当我使用该库时,我得到 undefined symbol 错误。所以我用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 标志之前;没有成功。
  • c++gcc替换cc;命令有效,但输出相同
  • 在构建工作的系统上删除 -lgstvideo-1.0。生成的库构建(链接)没有错误;但是在执行时,我遇到了与 Ubuntu 上相同的 undefined symbol 错误。这证明缺少的符号在 libgstvideo-1.0.so 中,并且我需要它。

【问题讨论】:

    标签: linker gstreamer cc


    【解决方案1】:

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

    这可能是一种默认的编译器行为,即当没有实际使用库中的符号时,它会跳过库的链接。

    尝试使用-Wl,--no-as-needed 标记您的标志。在这种情况下,库应该被链接——而不是检查它的符号是否被实际使用。

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

    【讨论】:

    • 是的,我确实需要一些符号;奇怪的是,当我从链接命令行中删除 -lgstvideo-1. 时;我的库生成时没有错误。再次执行时;未定义的符号...
    • 我用你的标志“--no-as-needed”重试了,现在它确实被链接了......这太奇怪了!
    • 您的链接器标志可以解决问题;但很奇怪我需要这样做......
    • 这也不算太奇怪。编译器试图以所有可能的方式帮助您。因此,如果您不小心添加了一个根本不需要的库,它可能会尝试完全摆脱它,以免造成不必要的依赖。
    • 我明白这一点,但奇怪的是我确实需要那个库,而链接器没有检测到它!
    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2019-02-25
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多