指定要在Automake中链接的精确库

时间:2012-09-04 23:07:32

标签: c ld autoconf automake

我在编译与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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

全部,这与以下问题有关:set global gcc default search paths

这里的问题与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]

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