我正在使用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似乎可以解决所有问题。