0

我在交叉编译与 gstreamer 相关的项目时遇到了极大的麻烦。我正在尝试将它链接到我的交叉编译机上的库/usr/lib

如果我执行标准链接器标志-L{FILESYS_DIR}/usr/lib -lGLESv2,我会从我的交叉编译工具链中收到 pthread 投诉。因此,我试图在不使用-L标志的情况下链接到这个库。

无论我做什么,我都会得到undefined symbol glFramebuffer2D. 但是快速readelf -Wc $FILESYS_DIR/usr/lib/libGLESv2.so | glFrame向我展示了一个 glFramebuffer2D 符号。

我正在拉扯我的头发,因为无论我为 autoconf 指定什么标志,除非我使用这种方法,否则名为 libtool 的东西会丢弃我的链接请求-L -l......

编辑: 我有另一个想法,我尝试-Wl, $FILESYS_DIR/usr/lib/libGLESv2.so过在编译和链接中起作用,但在运行时不起作用……对我来说很明显(现在),因为主机根目录是 $FILESYS_DIR。无论如何,这是正确的方法,但我想我需要相对名称。


libtool: link:  arm-none-linux-gnueabi-gcc -shared  .libs/libgstbla_la-gstblaoverlay.o
  .libs/libgstbla_la-gstblastabilize.o .libs/libgstbla_la-gles2_utilities.o   -Wl,-
  rpath -Wl,/home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib -Wl,-rpath -
  Wl,/home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib -L/home/z3/z3-
  netra/filesys/fs/opt/gstreamer/lib /home/z3/z3-netra/filesys/fs//opt/gstreamer-
  0.4/lib/libgstbase-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-
  0.4/lib/libgstreamer-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-
  0.4/lib/libgstvideo-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-
  0.4/lib/libgobject-2.0.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-
  0.4/lib/libgmodule-2.0.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-
  0.4/lib/libgthread-2.0.so -lrt /home/z3/z3-netra/filesys/fs//opt/gstreamer-
  0.4/lib/libglib-2.0.so    -pthread -Wl,-soname -Wl,libgstbla.so -Wl,-version-script -
  Wl,.libs/libgstbla.ver -o .libs/libgstbla.so

如果需要,也可以在一行中:

libtool: link:  arm-none-linux-gnueabi-gcc -shared  .libs/libgstbla_la-gstblaoverlay.o .libs/libgstbla_la-gstblastabilize.o .libs/libgstbla_la-gles2_utilities.o   -Wl,-rpath -Wl,/home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib -Wl,-rpath -Wl,/home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib -L/home/z3/z3-netra/filesys/fs/opt/gstreamer/lib /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgstbase-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgstreamer-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgstvideo-0.10.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgobject-2.0.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgmodule-2.0.so /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libgthread-2.0.so -lrt /home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib/libglib-2.0.so    -pthread -Wl,-soname -Wl,libgstbla.so -Wl,-version-script -Wl,.libs/libgstbla.ver -o .libs/libgstbla.so
4

2 回答 2

0

/usr/lib应该已经在库搜索路径上,因此您不需要指定 RPATH。但是,您需要做的是告诉您的(交叉)链接器在哪里可以找到库。我认为这包括传递依赖,例如 libpthread。你有$FILESYS_DIR/usr/lib/libpthread.so吗?它指向/lib/libpthread.so.N? 哦,等等,我现在看到了一些我写出来的东西:注意那里(可能)不$FILESYS_DIR存在:所以你的链接器可能正在寻找 libGLESv2 传递需要的 libpthread,但没有找到它,因为$FILESYS_DIR/lib它不在库包含路径中. 添加-L $FILESYS_DIR/lib到您的链接器标志并重试。

于 2012-09-08T01:07:13.643 回答
0

所有,这与以下问题有关:设置全局 gcc 默认搜索路径

这里的问题与 pthread.so(也是 glib.so)有关。许多系统上的 /usr/lib/pthread.so 是一个 ASCII 脚本,然后进一步链接到系统的 /lib/pthread.so.0(这是一个软链接)。编译时,我的 $(FILESYS_DIR) 是正确的,但是那里的 libpthread.so 指向主机系统 pthread.so

我在这里犯了一个巨大的错误,通过正确的交叉编译管理可以轻松避免。为目标系统编译时,不要使用目标系统文件系统上的文件(如果它像我一样是 NFS。)使用为该目标系统编译的本地库。进一步,指定-Wl,-rpath-link=/[local location where your *.so reside]

该编译器/链接器标志允许在编译和链接期间运行时路径位于本地系统上,但在运行时保持标准运行时路径....希望这是有道理的。

于 2012-09-10T16:51:30.047 回答