当 --sysroot 指向另一个目录时,如何让 FFmpeg 找到已安装的库?
我已经研究这个问题好几天了。我正在尝试使用 libmp3lame 构建 FFmpeg 以在 Android 应用程序中使用。构建脚本设置一个 --sysroot
标志,该标志指向以 Android 可以使用它们的方式构建这些库所需的 Android NDK 目录。
当我将标志添加到 --enable-libmp3lame
时,问题就出现了;在构建启动期间,我收到 ERROR: libmp3lame >= 3.98.3 not found
。我知道 LAME 及其库已安装,因为我可以手动运行 ./configure --enable-libmp3lame
并且配置会顺利启动,并显示为此构建启用了 libmp3lame。然而,这样的构建根本无法满足我的需要,因为我需要 Android NDK 来完成一些工作。
我已经将问题归结为这个构建脚本声明了 sysroot,并且通过一些研究,我尝试添加 -Luser/include
、-L/user/include到额外的 cflags 和 ldflags (我读过的是 gcc 的默认搜索位置)。我还尝试了其他一些方法,但我相信这里有人可以帮助解决这个特定问题。整个构建脚本如下:
额外信息:
- 构建操作系统:Ubuntu 11.10
- FFmpeg Ver:来自 git
- LAME 的最新版本:3.9.x
- Android NDK:r7
build.sh
#!/bin/bash
if [ "$NDK" = "" ]; then
echo NDK variable not set, assuming ${HOME}/android-ndk
export NDK=${HOME}/android-ndk
fi
SYSROOT=$NDK/platforms/android-3/arch-arm
# Expand the prebuilt/* path into the correct one
TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/*-x86`
export PATH=$TOOLCHAIN/bin:$PATH
rm -rf build/ffmpeg
mkdir -p build/ffmpeg
cd ffmpeg
# Don't build any neon version for now
for version in armv5te armv7a; do
DEST=../build/ffmpeg
FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm"
FLAGS="$FLAGS --sysroot=$SYSROOT"
FLAGS="$FLAGS --soname-prefix=/data/data/net.smartnotes/lib/"
FLAGS="$FLAGS --enable-shared --disable-symver"
FLAGS="$FLAGS --enable-small --optimization-flags=-O2"
FLAGS="$FLAGS --disable-everything --enable-protocol=file"
FLAGS="$FLAGS --enable-libmp3lame --enable-encoder=nellymoser"
case "$version" in
neon)
EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8"
# Runtime choosing neon vs non-neon requires
# renamed files
ABI="armeabi-v7a"
;;
armv7a)
# I have tried many things here.
EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp"
EXTRA_LDFLAGS=""
ABI="armeabi-v7a"
;;
*)
# I have tried many things here.
EXTRA_CFLAGS="-Luser/include"
EXTRA_LDFLAGS=""
ABI="armeabi"
;;
esac
DEST="$DEST/$ABI"
FLAGS="$FLAGS --prefix=$DEST"
mkdir -p $DEST
echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" > $DEST/info.txt
./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" | tee $DEST/configuration.txt
[ $PIPESTATUS == 0 ] || exit 1
make clean
make -j4 || exit 1
make install || exit 1
done
I've been going at this, literally for days. I'm trying to build FFmpeg with libmp3lame for use in an Android application. The build script sets a --sysroot
flag that points to the Android NDK directory necessary to build these libraries in a way that Android can use them.
The problem comes when I add the flag to --enable-libmp3lame
; I get ERROR: libmp3lame >= 3.98.3 not found
during the build start up. I know that LAME, and it's libraries are installed, because I can just run ./configure --enable-libmp3lame
manually and the configuration launches without a hitch, and shows that libmp3lame is enabled for this build. However, building like this will simply not work for what I need it for, since I need the Android NDK to do some work.
I've tracked the problem down to the fact that this build script is declaring the sysroot, and through some research, I've tried adding -Luser/include
, -L/user/include
to the extra cflags, and ldflags (which I've read is the default search location for gcc). I've tried several other things as well, but I'm confident that someone out here can help with this specific problem. This entire build script is as follows:
Extra info:
- Build OS: Ubuntu 11.10
- FFmpeg Ver: Latest from git
- LAME Ver: 3.9.x
- Android NDK: r7
build.sh
#!/bin/bash
if [ "$NDK" = "" ]; then
echo NDK variable not set, assuming ${HOME}/android-ndk
export NDK=${HOME}/android-ndk
fi
SYSROOT=$NDK/platforms/android-3/arch-arm
# Expand the prebuilt/* path into the correct one
TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/*-x86`
export PATH=$TOOLCHAIN/bin:$PATH
rm -rf build/ffmpeg
mkdir -p build/ffmpeg
cd ffmpeg
# Don't build any neon version for now
for version in armv5te armv7a; do
DEST=../build/ffmpeg
FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm"
FLAGS="$FLAGS --sysroot=$SYSROOT"
FLAGS="$FLAGS --soname-prefix=/data/data/net.smartnotes/lib/"
FLAGS="$FLAGS --enable-shared --disable-symver"
FLAGS="$FLAGS --enable-small --optimization-flags=-O2"
FLAGS="$FLAGS --disable-everything --enable-protocol=file"
FLAGS="$FLAGS --enable-libmp3lame --enable-encoder=nellymoser"
case "$version" in
neon)
EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8"
# Runtime choosing neon vs non-neon requires
# renamed files
ABI="armeabi-v7a"
;;
armv7a)
# I have tried many things here.
EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp"
EXTRA_LDFLAGS=""
ABI="armeabi-v7a"
;;
*)
# I have tried many things here.
EXTRA_CFLAGS="-Luser/include"
EXTRA_LDFLAGS=""
ABI="armeabi"
;;
esac
DEST="$DEST/$ABI"
FLAGS="$FLAGS --prefix=$DEST"
mkdir -p $DEST
echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" > $DEST/info.txt
./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" | tee $DEST/configuration.txt
[ $PIPESTATUS == 0 ] || exit 1
make clean
make -j4 || exit 1
make install || exit 1
done
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
与其更改包含路径,不如尝试将“make install”创建的所有 libmp3lame 文件复制到脚本将查找它们的相关目录。插入 ECHO 语句以找出出现错误时的 PATH/CFLAGS/LDFLAGS 到底是什么,然后将文件复制到那里,以便它找到它们。
Instead of changing the include paths, why don't you try copying all the libmp3lame files that were created by 'make install' to the relevant directory where the script will look for them. Insert ECHO statements to find out what exactly the PATH/CFLAGS/LDFLAGS are at the point where you get the error, and copy the files there so it does find them.
我看到你正在使用位于
http://bambuser.com/opensource
我遇到了同样的问题并像这样解决:
这是一个小的
差异 原来之间来自“bambuser.com”的
build.sh
和我使用的:<前><代码>3c3,6
<导出 NDK=${HOME}/downloads/android-ndk # r8d
---
>如果[“$NDK”=“”];然后
> echo NDK 变量未设置,假设 ${HOME}/android-ndk
>导出 NDK=${HOME}/android-ndk
>菲
15,16c18
< #适用于armv5te armv7a版本;做
<对于armv7a版本;做
---
>对于armv5te armv7a版本;做
24c26
< FLAGS =“$ FLAGS --disable-everything --enable-libmp3lame”
---
> FLAGS="$FLAGS --禁用一切"
来自“ intervigilium”项目将文件夹
liblame/jni/lame
PATH_TO_NDK/platforms/android-3/arch-arm/usr/libs
并重命名libmp3lame.so
。build.sh
。你应该没问题:
请注意,我仍然需要测试生成的 FFmpeg 版本。
说实话,现在我必须学习如何在我的应用程序中使用它......;)
编辑:我尝试删除
--disable-everything
并且构建正常同样,有很多编码器、解码器等,但build
目录增加到约 40MB。I saw you were using the project located at
http://bambuser.com/opensource
I had the same problem and resolved like this:
this is a small
diff
between the originalbuild.sh
from "bambuser.com" and the one I used:from "intervigilium" project copy the folder
liblame/jni/lame
toPATH_TO_NDK/platforms/android-3/arch-arm/usr/include
liblame/libs/armeabi-v7a/liblame.so
toPATH_TO_NDK/platforms/android-3/arch-arm/usr/libs
and RENAME it inlibmp3lame.so
.build.sh
.you should be fine:
Be aware, I still need to test the resulting FFmpeg build.
To say the truth, now I have to learn how to use it in my App... ;)
EDIT: I tried removing
--disable-everything
and it builds OK the same, with a lot of encoders, decoders etc, but increasing to ~40MB for thebuild
dir.