【问题标题】:make: $LD_RUN_PATH is ignoredmake: $LD_RUN_PATH 被忽略
【发布时间】:2012-03-26 05:42:25
【问题描述】:

我正在从源代码编译 FFmpeg。

./configure --enable-shared --enable-gpl --enable-version3 --enable-nonfree --enable-x11grab --enable-libfaac --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264
make
make install

ldd /usr/local/bin/ffmpeg 给了我这个

linux-gate.so.1 =>  (0xb7717000)
libavdevice.so.53 => not found
libavfilter.so.2 => not found
libavformat.so.54 => not found
libavcodec.so.54 => not found
libpostproc.so.52 => not found
libswresample.so.0 => not found
libswscale.so.2 => not found
libavutil.so.51 => not found
libm.so.6 => /lib/i386-linux-gnu/tls/i686/nosegneg/libm.so.6 (0xb76e3000)
libpthread.so.0 => /lib/i386-linux-gnu/tls/i686/nosegneg/libpthread.so.0 (0xb76ca000)
libc.so.6 => /lib/i386-linux-gnu/tls/i686/nosegneg/libc.so.6 (0xb7569000)
/lib/ld-linux.so.2 (0xb7718000)

$LD_LIBRARY_PATH 设置为/usr/local/lib 更正了“未找到”错误,但由于here 提到的原因,我不想永久设置$LD_LIBRARY_PATH

我使用相同的命令重新编译,这次将$LD_RUN_PATH 设置为/usr/local/lib
make 在编译时似乎忽略了$LD_RUN_PATH

有没有一种方法可以使用$LD_RUN_PATH 而无需对 Makefile 进行大量更改?

【问题讨论】:

  • 你可以手动链接成功吗(即在命令行上,不使用make)?
  • 我不知道。我该如何测试呢?
  • 你能告诉我们执行ldd /usr/local/bin/ffmpeg的makefile部分吗?
  • 您是如何配置 FFmpeg 的(即,您将哪些选项传递给 ./configure 脚本)?构建后您是如何安装 FFmpeg 的;您是否手动将“ffmpeg”复制到/usr/local/lib?还是您执行了“make install”?
  • 查看linux.die.net/man/8/ld-linux 中的变量LD_DEBUGLD_DEBUG_OUTPUT

标签: compilation ffmpeg makefile ld


【解决方案1】:

您是否有理由在共享模式下编译二进制文件(比如想要构建软件来链接它们)?如果静态 'ffmpeg' 二进制文件同样适合您,请在不使用 --enable-shared 选项的情况下进行配置以消除这些依赖关系。

否则,您需要让您的系统知道共享库所在的位置,方法是在环境中设置 LD_LIBRARY_PATH,在 'ffmpeg' 的执行前加上 LD_LIBRARY_PATH(例如,“LD_LIBRARY_PATH=/usr/local/lib /usr/ local/bin/ffmpeg"),或者使用正确的位置更新系统的库路径。

您在帖子中链接的页面底部还有一个解决方案:“LDFLAGS='-L/my/strange/path/lib -Wl,-rpath /my/strange/path/lib ’”。对于 FFmpeg 和您的情况,请在配置时传递此额外参数:

--extra-ldflags="-L/usr/local/lib -Wl,-rpath /usr/local/lib"

生成的“ffmpeg”二进制文件将知道在哪里可以找到共享库。

许多解决方案。

【讨论】:

  • 我不知道我是否需要共享选项,但说明使用的是什么。 --extra-ldflags 完美运行。
【解决方案2】:
  1. 很可能 LD_RUN_PATH 被忽略,因为包的 ./configure 已经在链接器的 cmdline 中放置了一些 -Wl,-rpath 选项(坦率地说,我不了解自己。我在这里看到相同的行为,但我正在交叉编译从 486 到 mips32)。

  2. 尝试像这样运行配置: ./configure LDFLAGS="-L/your/lib -Wl,-rpath-link=/your/lib" CPPFLAGS="-I/your/include" --prefix=/tgt ...

    如果 /your 目录与 /tgt 不同,我建议使用 -rpath-link 而不是 -rpath

【讨论】:

    【解决方案3】:

    对于其他偶然发现此问题的人,$LD_RUN_PATH 不起作用的原因可能是由于 this bug 使用了黄金链接器。

    (解决方法是使用 Mike 的回答中描述的 rpath)

    【讨论】:

      猜你喜欢
      • 2014-07-26
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2016-06-05
      • 2014-02-25
      • 2011-05-09
      • 2015-02-08
      相关资源
      最近更新 更多