【问题标题】:Specifying Exact Library to Link with In Automake在 Automake 中指定要链接的确切库
【发布时间】:2012-09-04 23:07:32
【问题描述】:

我在交叉编译与 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 指定什么标志,除非我使用 -L -l 方法,否则名为 libtool 的东西会丢弃我的链接请求...

编辑:我有另一个想法,我尝试了-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

【问题讨论】:

  • 您使用了两次-Wl,-rpath,但实际上并未设置运行时路径。将它们设置为目标系统上的有效库路径,它应该会更好地工作。
  • 有趣,请注意,链接调用是由 Automake 为我生成的。我会环顾四周,看看是否可以解决该特定问题。
  • 当您说“无论我为 autoconf 指定什么标志”时,您指的是您为配置脚本指定的标志吗?
  • 是的,我将它添加到 ./configure 调用中。
  • @JoachimPileborg 有一个运行时路径:它在以下 -Wl 参数中设置:-Wl,/home/z3/z3-netra/filesys/fs//opt/gstreamer-0.4/lib

标签: c ld autoconf automake


【解决方案1】:

/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 添加到您的链接器标志中,然后重试。

【讨论】:

    【解决方案2】:

    所有,这与以下问题有关: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]

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      相关资源
      最近更新 更多