C++交叉编译 请帮忙看看是哪个库没有链接

sno_guo 2013-01-31 09:09:18
我在交叉编译一个cpp程序的时候,提示说:

undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)'
undefined reference to `std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)'
undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base const*)'
undefined reference to `android::RefBase::decStrong(void const*) const'
是不是我在链接 的时候,忘记链接哪个库了,请帮忙看下,谢谢!
我链接的库有:-lcutils -ldl -lstlport -lc -lm -lz -ldl -llog -lstdc++ -lstagefright -lbinder
但还是 出现上面 的错误。请问下为什么?
...全文
1570 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
wishes2009 2015-06-10
  • 打赏
  • 举报
回复
在android.mk中添加一下两行试试 LOCAL_LDLIBS += ~\android-ndk-r10d\sources\cxx-stl\gnu-libstdc++\4.8\libs\armeabi\libsupc++.a LOCAL_LDLIBS += ~\android-ndk-r10d\sources\cxx-stl\gnu-libstdc++\4.8\libs\armeabi\libgnustl_static.a
爱马尔 2014-10-13
  • 打赏
  • 举报
回复
libgnustl_shared.so里有_Rb_tree_decrement,但是libstlport_shared.so没有该方法, 可以通过nm libstlport_shared.so 查看函数
fashionmany 2014-02-11
  • 打赏
  • 举报
回复
引用 16 楼 sno_guo 的回复:
谢谢 版主 ,以下是我的编译脚本:
#!/bin/bash
NDK=/home/sno/androidStudio/android-ndk-r6
PLATFORM=$NDK/platforms/android-9/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
ANDROID23HEADER1=/home/sno/binxxx/android_source2.3.3/frameworks/base/include
ANDROID23HEADER2=/home/sno/binxxx/android_source2.3.3/system/core/include 
ANDROID23HEADER3=/home/sno/binxxx/android_source2.3.3/frameworks/base/media/libstagefright
ANDROID23HEADER4=/home/sno/binxxx/android_source2.3.3/frameworks/base/
ANDROID23HEADER5=/home/sno/binxxx/android_source2.3.3/frameworks/base/include/media/stagefright/openmax

SYSROOT=$NDK/platforms/android-9/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
ANDROID_SOURCE=../android-source
ANDROID_LIBS=../android-libs
ABI="armeabi-v7a"

rm -rf ../build/stagefright
mkdir -p ../build/stagefright

DEST=../build/stagefright
FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm --cpu=armv7-a"
FLAGS="$FLAGS --sysroot=$SYSROOT"
FLAGS="$FLAGS --disable-avdevice --enable-parsers --enable-decoders --enable-demuxers --enable-network --enable-protocols --enable-protocol=file --enable-swscale --enable-swresample --enable-avformat --enable-avcodec --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-devices --disable-avdevice --disable-postproc --disable-avfilter --disable-swscale-alpha --disable-bsfs --disable-encoders --disable-muxers --disable-indevs --disable-debug --disable-doc --disable-demuxer=srt --disable-demuxer=microdvd --disable-demuxer=jacosub --disable-demuxer=dts --disable-decoder=ass --disable-decoder=srt --disable-decoder=microdvd --disable-decoder=jacosub --enable-bzlib --enable-zlib --enable-pic --enable-optimizations --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-libstagefright-h264 --enable-decoder=libstagefright"

EXTRA_CFLAGS="-I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/include -I$NDK/sources/cxx-stl/gnu-libstdc++/libs/$ABI/include"

EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -L$PLATFORM/usr/lib -rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/libs/$ABI"
EXTRA_CXXFLAGS="-Wno-multichar -fexceptions -frtti -lstdc++ -lstlport -lcutils -lstagefright -lbinder -lc -lm -lz -ldl -llog"
DEST="$DEST/$ABI"
FLAGS="$FLAGS --prefix=$DEST"

mkdir -p $DEST

echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" > $DEST/info.txt
./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" | tee $DEST/configuration.txt
[ $PIPESTATUS == 0 ] || exit 1
#make clean
make -j4 || exit 1
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o

$PREBUILT/bin/arm-linux-androideabi-ld -fexceptions -frtti -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a -L$ANDROID_LIBS  -soname libffmpeg.so -shared -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o ./libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a libswresample/libswresample.a -lc -lm -lz -ldl -llog -lstdc++ -lstlport -lcutils -lstagefright -lbinder -lstdc++ -lstlport --warn-once  --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
---------以下是我的终端出错信息: WARNING: arm-linux-androideabi-pkg-config not found, library detection may fail. WARNING: Compiler does not indicate floating-point ABI, guessing soft. libavcodec/libavcodec.a(libstagefright.o): In function `Stagefright_decode_frame(AVCodecContext*, void*, int*, AVPacket*)': libstagefright.cpp:(.text+0x42c): undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)' libstagefright.cpp:(.text+0x488): undefined reference to `std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)' libstagefright.cpp:(.text+0x5f0): undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base const*)' libstagefright.cpp:(.text+0x924): undefined reference to `__cxa_end_cleanup' libavcodec/libavcodec.a(libstagefright.o): In function `decode_thread(void*)': libstagefright.cpp:(.text+0xce4): undefined reference to `android::RefBase::decStrong(void const*) const' libstagefright.cpp:(.text+0x1214): undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base*)' libstagefright.cpp:(.text+0x1224): undefined reference to `std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)' libavcodec/libavcodec.a(libstagefright.o): In function `CustomSource::getFormat()': libstagefright.cpp:(.text._ZN12CustomSource9getFormatEv[_ZN12CustomSource9getFormatEv]+0x20): undefined reference to `android::RefBase::incStrong(void const*) const' libavcodec/libavcodec.a(libstagefright.o):(.ARM.extab.text.unlikely+0x0): undefined reference to `__gxx_personality_v0' libavcodec/libavcodec.a(libstagefright.o): In function `std::_Rb_tree<long long, std::pair<long long const, TimeStamp>, std::_Select1st<std::pair<long long const, TimeStamp> >, std::less<long long>, std::allocator<std::pair<long long const, TimeStamp> > >::_M_insert_unique(std::pair<long long const, TimeStamp> const&)': libstagefright.cpp:(.text._ZNSt8_Rb_treeIxSt4pairIKx9TimeStampESt10_Select1stIS3_ESt4lessIxESaIS3_EE16_M_insert_uniqueERKS3_[_ZNSt8_Rb_treeIxSt4pairIKx9TimeStampESt10_Select1stIS3_ESt4lessIxESaIS3_EE16_M_insert_uniqueERKS3_]+0xd0): undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x10): undefined reference to `android::RefBase::onFirstRef()' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x14): undefined reference to `android::RefBase::onLastStrongRef(void const*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x18): undefined reference to `android::RefBase::onIncStrongAttempted(unsigned int, void const*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x1c): undefined reference to `android::RefBase::onLastWeakRef(void const*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTI12CustomSource[_ZTI12CustomSource]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTI12CustomSource[_ZTI12CustomSource]+0x8): undefined reference to `typeinfo for android::MediaSource' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTIN7android4ListIP5FrameEE[_ZTIN7android4ListIP5FrameEE]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
请问lz问题解决了么,如何解决的?偶也遇到这样的问题。
  • 打赏
  • 举报
回复
这个库没有。 libutils,我自己的编译问题。 android::RefBase::incStrong android::RefBase::decStrong 找不到,已经接近。 是通过使用 zhao4zhong1 的建议解决的。
lidedongsn 2013-10-09
  • 打赏
  • 举报
回复
引用 16 楼 sno_guo 的回复:
谢谢 版主 ,以下是我的编译脚本:
#!/bin/bash
NDK=/home/sno/androidStudio/android-ndk-r6
PLATFORM=$NDK/platforms/android-9/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
ANDROID23HEADER1=/home/sno/binxxx/android_source2.3.3/frameworks/base/include
ANDROID23HEADER2=/home/sno/binxxx/android_source2.3.3/system/core/include 
ANDROID23HEADER3=/home/sno/binxxx/android_source2.3.3/frameworks/base/media/libstagefright
ANDROID23HEADER4=/home/sno/binxxx/android_source2.3.3/frameworks/base/
ANDROID23HEADER5=/home/sno/binxxx/android_source2.3.3/frameworks/base/include/media/stagefright/openmax

SYSROOT=$NDK/platforms/android-9/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
ANDROID_SOURCE=../android-source
ANDROID_LIBS=../android-libs
ABI="armeabi-v7a"

rm -rf ../build/stagefright
mkdir -p ../build/stagefright

DEST=../build/stagefright
FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm --cpu=armv7-a"
FLAGS="$FLAGS --sysroot=$SYSROOT"
FLAGS="$FLAGS --disable-avdevice --enable-parsers --enable-decoders --enable-demuxers --enable-network --enable-protocols --enable-protocol=file --enable-swscale --enable-swresample --enable-avformat --enable-avcodec --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-devices --disable-avdevice --disable-postproc --disable-avfilter --disable-swscale-alpha --disable-bsfs --disable-encoders --disable-muxers --disable-indevs --disable-debug --disable-doc --disable-demuxer=srt --disable-demuxer=microdvd --disable-demuxer=jacosub --disable-demuxer=dts --disable-decoder=ass --disable-decoder=srt --disable-decoder=microdvd --disable-decoder=jacosub --enable-bzlib --enable-zlib --enable-pic --enable-optimizations --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-libstagefright-h264 --enable-decoder=libstagefright"

EXTRA_CFLAGS="-I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/include -I$NDK/sources/cxx-stl/gnu-libstdc++/libs/$ABI/include"

EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -L$PLATFORM/usr/lib -rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/libs/$ABI"
EXTRA_CXXFLAGS="-Wno-multichar -fexceptions -frtti -lstdc++ -lstlport -lcutils -lstagefright -lbinder -lc -lm -lz -ldl -llog"
DEST="$DEST/$ABI"
FLAGS="$FLAGS --prefix=$DEST"

mkdir -p $DEST

echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" > $DEST/info.txt
./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" | tee $DEST/configuration.txt
[ $PIPESTATUS == 0 ] || exit 1
#make clean
make -j4 || exit 1
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o

$PREBUILT/bin/arm-linux-androideabi-ld -fexceptions -frtti -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a -L$ANDROID_LIBS  -soname libffmpeg.so -shared -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o ./libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a libswresample/libswresample.a -lc -lm -lz -ldl -llog -lstdc++ -lstlport -lcutils -lstagefright -lbinder -lstdc++ -lstlport --warn-once  --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
---------以下是我的终端出错信息: WARNING: arm-linux-androideabi-pkg-config not found, library detection may fail. WARNING: Compiler does not indicate floating-point ABI, guessing soft. libavcodec/libavcodec.a(libstagefright.o): In function `Stagefright_decode_frame(AVCodecContext*, void*, int*, AVPacket*)': libstagefright.cpp:(.text+0x42c): undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)' libstagefright.cpp:(.text+0x488): undefined reference to `std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)' libstagefright.cpp:(.text+0x5f0): undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base const*)' libstagefright.cpp:(.text+0x924): undefined reference to `__cxa_end_cleanup' libavcodec/libavcodec.a(libstagefright.o): In function `decode_thread(void*)': libstagefright.cpp:(.text+0xce4): undefined reference to `android::RefBase::decStrong(void const*) const' libstagefright.cpp:(.text+0x1214): undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base*)' libstagefright.cpp:(.text+0x1224): undefined reference to `std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)' libavcodec/libavcodec.a(libstagefright.o): In function `CustomSource::getFormat()': libstagefright.cpp:(.text._ZN12CustomSource9getFormatEv[_ZN12CustomSource9getFormatEv]+0x20): undefined reference to `android::RefBase::incStrong(void const*) const' libavcodec/libavcodec.a(libstagefright.o):(.ARM.extab.text.unlikely+0x0): undefined reference to `__gxx_personality_v0' libavcodec/libavcodec.a(libstagefright.o): In function `std::_Rb_tree<long long, std::pair<long long const, TimeStamp>, std::_Select1st<std::pair<long long const, TimeStamp> >, std::less<long long>, std::allocator<std::pair<long long const, TimeStamp> > >::_M_insert_unique(std::pair<long long const, TimeStamp> const&)': libstagefright.cpp:(.text._ZNSt8_Rb_treeIxSt4pairIKx9TimeStampESt10_Select1stIS3_ESt4lessIxESaIS3_EE16_M_insert_uniqueERKS3_[_ZNSt8_Rb_treeIxSt4pairIKx9TimeStampESt10_Select1stIS3_ESt4lessIxESaIS3_EE16_M_insert_uniqueERKS3_]+0xd0): undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x10): undefined reference to `android::RefBase::onFirstRef()' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x14): undefined reference to `android::RefBase::onLastStrongRef(void const*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x18): undefined reference to `android::RefBase::onIncStrongAttempted(unsigned int, void const*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x1c): undefined reference to `android::RefBase::onLastWeakRef(void const*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTI12CustomSource[_ZTI12CustomSource]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTI12CustomSource[_ZTI12CustomSource]+0x8): undefined reference to `typeinfo for android::MediaSource' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTIN7android4ListIP5FrameEE[_ZTIN7android4ListIP5FrameEE]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
这个问题解决了吗?
aki_studio 2013-04-12
  • 打赏
  • 举报
回复
引用 23 楼 zhao4zhong1 的回复:
用objdump查看_Rb_tree_insert_and_rebalance在哪个.so中。 libstl.so libstlp.so libstlport.so 楼主会全盘搜索lib*stl*.so文件都有哪些吧。
这么多stl,都有什么不一样?我怎么知道该用哪个?找了找不知道哪里有说明
赵4老师 2013-04-11
  • 打赏
  • 举报
回复
用objdump查看_Rb_tree_insert_and_rebalance在哪个.so中。 libstl.so libstlp.so libstlport.so 楼主会全盘搜索lib*stl*.so文件都有哪些吧。
aki_studio 2013-04-11
  • 打赏
  • 举报
回复
引用 19 楼 sno_guo 的回复:
哦,谢谢,换成g++后,再删除掉一些无法识别的选项后,是可以生成 动态库的,但是我用nm -D libffmpeg.so看了一下,发现里面什么都没有链接上去。更没有我要的一些函数。 比如说: 不包含cpp文件的时候,大小是6.9M,加上cpp文件,文件大小应该大于或等于6.9M,而不应该是60k吧。 我怀疑更不行。
引用 21 楼 ctroll 的回复:
LOCAL_LDLIBS += -L/home/new/android-ndk-r8d/sources/cxx-stl/gnu-libstdc++/libs/armeabi \ -lgnustl_static 加这个到mk文件中即可。 必须链接 stl 的静态库。
楼主解决了吗?我也遇到了这个问题, 发现ndk下面有 sources/cxx-stl/stlport , 又有 sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi-v7a/libgnustl_static.a 那么,疑问就来了, 我是应该写 -lgnustl_static ,还是 -lstlport ? 都试了,现象依旧
ctroll 2013-03-08
  • 打赏
  • 举报
回复
LOCAL_LDLIBS += -L/home/new/android-ndk-r8d/sources/cxx-stl/gnu-libstdc++/libs/armeabi \ -lgnustl_static 加这个到mk文件中即可。 必须链接 stl 的静态库。
mymtom 2013-02-03
  • 打赏
  • 举报
回复
引用 19 楼 sno_guo 的回复:
哦,谢谢,换成g++后,再删除掉一些无法识别的选项后,是可以生成 动态库的,但是我用nm -D libffmpeg.so看了一下,发现里面什么都没有链接上去。更没有我要的一些函数。 比如说: 不包含cpp文件的时候,大小是6.9M,加上cpp文件,文件大小应该大于或等于6.9M,而不应该是60k吧。 我怀疑更不行。
这样啊?有些不解,是不是与删除掉一些无法识别的选项有关啊!最有可能的就是 --whole-archive这个选项。 楼主能否试试这样,不这些g++不认识的选项用-Wl,option传递给ld. 比如g++不认识--whole-archive 和--dynamic-linker=/system/bin/linker -soname=libffmpeg.so选项,就可以用 $PREBUILT/bin/arm-linux-androideabi-g++ -Wl,-soname=libffmpeg.so -Wl,--whole-archive -Wl,--dynamic-linker=/system/bin/linker -Wl,option可以多次使用。
sno_guo 2013-02-02
  • 打赏
  • 举报
回复
打错,是还没有弄出来,或许是因为我平时很少使用gcc和g++混合编程导致的吧。等我明白了,贴上解决办法,呵呵,真心的 感谢这么多好人的帮助。呵呵,谢谢了
sno_guo 2013-02-02
  • 打赏
  • 举报
回复
谢谢各位了,这个还是弄出来,等我明白了,贴上解决办法,呵呵,真心的 感谢这么多好人的帮助。呵呵,谢谢了
sno_guo 2013-02-02
  • 打赏
  • 举报
回复
哦,谢谢,换成g++后,再删除掉一些无法识别的选项后,是可以生成 动态库的,但是我用nm -D libffmpeg.so看了一下,发现里面什么都没有链接上去。更没有我要的一些函数。 比如说: 不包含cpp文件的时候,大小是6.9M,加上cpp文件,文件大小应该大于或等于6.9M,而不应该是60k吧。 我怀疑更不行。
mymtom 2013-02-02
  • 打赏
  • 举报
回复
这个我自己没有做过,只是猜测,楼主试试编译脚本的最后一行的ld改成g++ $PREBUILT/bin/arm-linux-androideabi-ld 改为 $PREBUILT/bin/arm-linux-androideabi-g++ 由于自己没有这个环境,只是猜测!
sno_guo 2013-02-02
  • 打赏
  • 举报
回复
我编译的是ffmpeg中的 libstagefright.cpp, 这个文件,想把他加入到ffmpeg中,就按照 ffmpeg的 tools/build_libstagefright 这个脚本来修改的。
sno_guo 2013-02-02
  • 打赏
  • 举报
回复
谢谢 版主 ,以下是我的编译脚本:
#!/bin/bash
NDK=/home/sno/androidStudio/android-ndk-r6
PLATFORM=$NDK/platforms/android-9/arch-arm/
PREBUILT=$NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86
ANDROID23HEADER1=/home/sno/binxxx/android_source2.3.3/frameworks/base/include
ANDROID23HEADER2=/home/sno/binxxx/android_source2.3.3/system/core/include 
ANDROID23HEADER3=/home/sno/binxxx/android_source2.3.3/frameworks/base/media/libstagefright
ANDROID23HEADER4=/home/sno/binxxx/android_source2.3.3/frameworks/base/
ANDROID23HEADER5=/home/sno/binxxx/android_source2.3.3/frameworks/base/include/media/stagefright/openmax

SYSROOT=$NDK/platforms/android-9/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
ANDROID_SOURCE=../android-source
ANDROID_LIBS=../android-libs
ABI="armeabi-v7a"

rm -rf ../build/stagefright
mkdir -p ../build/stagefright

DEST=../build/stagefright
FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm --cpu=armv7-a"
FLAGS="$FLAGS --sysroot=$SYSROOT"
FLAGS="$FLAGS --disable-avdevice --enable-parsers --enable-decoders --enable-demuxers --enable-network --enable-protocols --enable-protocol=file --enable-swscale --enable-swresample --enable-avformat --enable-avcodec --disable-ffmpeg --disable-ffplay --disable-ffprobe --disable-ffserver --disable-devices --disable-avdevice --disable-postproc --disable-avfilter --disable-swscale-alpha --disable-bsfs --disable-encoders --disable-muxers --disable-indevs --disable-debug --disable-doc --disable-demuxer=srt --disable-demuxer=microdvd --disable-demuxer=jacosub --disable-demuxer=dts --disable-decoder=ass --disable-decoder=srt --disable-decoder=microdvd --disable-decoder=jacosub --enable-bzlib --enable-zlib --enable-pic --enable-optimizations --disable-decoder=h264 --disable-decoder=h264_vdpau --enable-libstagefright-h264 --enable-decoder=libstagefright"

EXTRA_CFLAGS="-I$ANDROID_SOURCE/frameworks/base/include -I$ANDROID_SOURCE/system/core/include"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/media/libstagefright"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$ANDROID_SOURCE/frameworks/base/include/media/stagefright/openmax"
EXTRA_CFLAGS="$EXTRA_CFLAGS -I$NDK/sources/cxx-stl/gnu-libstdc++/include -I$NDK/sources/cxx-stl/gnu-libstdc++/libs/$ABI/include"

EXTRA_CFLAGS="$EXTRA_CFLAGS -march=armv7-a -mfloat-abi=softfp -mfpu=neon"
EXTRA_LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_LIBS -L$PLATFORM/usr/lib -rpath-link,$ANDROID_LIBS -L$NDK/sources/cxx-stl/gnu-libstdc++/libs/$ABI"
EXTRA_CXXFLAGS="-Wno-multichar -fexceptions -frtti -lstdc++ -lstlport -lcutils -lstagefright -lbinder -lc -lm -lz -ldl -llog"
DEST="$DEST/$ABI"
FLAGS="$FLAGS --prefix=$DEST"

mkdir -p $DEST

echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" > $DEST/info.txt
./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" --extra-cxxflags="$EXTRA_CXXFLAGS" | tee $DEST/configuration.txt
[ $PIPESTATUS == 0 ] || exit 1
#make clean
make -j4 || exit 1
$PREBUILT/bin/arm-linux-androideabi-ar d libavcodec/libavcodec.a inverse.o

$PREBUILT/bin/arm-linux-androideabi-ld -fexceptions -frtti -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$NDK/sources/cxx-stl/gnu-libstdc++/libs/armeabi-v7a -L$ANDROID_LIBS  -soname libffmpeg.so -shared -z,noexecstack -Bsymbolic --whole-archive --no-undefined -o ./libffmpeg.so libavcodec/libavcodec.a libavformat/libavformat.a libavutil/libavutil.a libswscale/libswscale.a libswresample/libswresample.a -lc -lm -lz -ldl -llog -lstdc++ -lstlport -lcutils -lstagefright -lbinder -lstdc++ -lstlport --warn-once  --dynamic-linker=/system/bin/linker $PREBUILT/lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a
---------以下是我的终端出错信息: WARNING: arm-linux-androideabi-pkg-config not found, library detection may fail. WARNING: Compiler does not indicate floating-point ABI, guessing soft. libavcodec/libavcodec.a(libstagefright.o): In function `Stagefright_decode_frame(AVCodecContext*, void*, int*, AVPacket*)': libstagefright.cpp:(.text+0x42c): undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)' libstagefright.cpp:(.text+0x488): undefined reference to `std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)' libstagefright.cpp:(.text+0x5f0): undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base const*)' libstagefright.cpp:(.text+0x924): undefined reference to `__cxa_end_cleanup' libavcodec/libavcodec.a(libstagefright.o): In function `decode_thread(void*)': libstagefright.cpp:(.text+0xce4): undefined reference to `android::RefBase::decStrong(void const*) const' libstagefright.cpp:(.text+0x1214): undefined reference to `std::_Rb_tree_increment(std::_Rb_tree_node_base*)' libstagefright.cpp:(.text+0x1224): undefined reference to `std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)' libavcodec/libavcodec.a(libstagefright.o): In function `CustomSource::getFormat()': libstagefright.cpp:(.text._ZN12CustomSource9getFormatEv[_ZN12CustomSource9getFormatEv]+0x20): undefined reference to `android::RefBase::incStrong(void const*) const' libavcodec/libavcodec.a(libstagefright.o):(.ARM.extab.text.unlikely+0x0): undefined reference to `__gxx_personality_v0' libavcodec/libavcodec.a(libstagefright.o): In function `std::_Rb_tree<long long, std::pair<long long const, TimeStamp>, std::_Select1st<std::pair<long long const, TimeStamp> >, std::less<long long>, std::allocator<std::pair<long long const, TimeStamp> > >::_M_insert_unique(std::pair<long long const, TimeStamp> const&)': libstagefright.cpp:(.text._ZNSt8_Rb_treeIxSt4pairIKx9TimeStampESt10_Select1stIS3_ESt4lessIxESaIS3_EE16_M_insert_uniqueERKS3_[_ZNSt8_Rb_treeIxSt4pairIKx9TimeStampESt10_Select1stIS3_ESt4lessIxESaIS3_EE16_M_insert_uniqueERKS3_]+0xd0): undefined reference to `std::_Rb_tree_decrement(std::_Rb_tree_node_base*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x10): undefined reference to `android::RefBase::onFirstRef()' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x14): undefined reference to `android::RefBase::onLastStrongRef(void const*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x18): undefined reference to `android::RefBase::onIncStrongAttempted(unsigned int, void const*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTV12CustomSource[_ZTV12CustomSource]+0x1c): undefined reference to `android::RefBase::onLastWeakRef(void const*)' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTI12CustomSource[_ZTI12CustomSource]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTI12CustomSource[_ZTI12CustomSource]+0x8): undefined reference to `typeinfo for android::MediaSource' libavcodec/libavcodec.a(libstagefright.o):(.data.rel.ro._ZTIN7android4ListIP5FrameEE[_ZTIN7android4ListIP5FrameEE]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
mymtom 2013-02-02
  • 打赏
  • 举报
回复
引用 13 楼 sno_guo 的回复:
打错,是还没有弄出来,或许是因为我平时很少使用gcc和g++混合编程导致的吧。等我明白了,贴上解决办法,呵呵,真心的 感谢这么多好人的帮助。呵呵,谢谢了
等一下,楼主你不会是用gcc命令做最后的链接吧? c和c++混合编程的话,最后的链接建议用g++命令
笨蛋糕 2013-02-02
  • 打赏
  • 举报
回复
交叉编译,围观学习
sniffer12345 2013-02-01
  • 打赏
  • 举报
回复
出错是stl没链上 你检查看看该stl是否支持RTTI和exception
sno_guo 2013-02-01
  • 打赏
  • 举报
回复
我的交叉编译环境是: NDK=/home/sno/androidStudio/android-ndk-r6 但我没有使用android的ndk-build,而是直接使用里面的arm-linux-androideabi-ld 这样在链接的时候,出错。不知道为什么, 我加上stl,也是出错。
加载更多回复(9)

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧