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

cc linker gives no error, but the resulting library is not linked to 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 标记。该命令运行良好,没有产生任何错误,生成的库也创建得很好。但是,当我使用该库时,出现 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

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

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

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

尝试-Wl,--no-as-needed你的旗帜。在这种情况下,库应该 linked - 不检查其符号是否实际使用。

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