当我尝试链接librubberband.a时,我得到: libavfilter / af_rubberband.c:236:错误:未定义引用'rubberband_set_pitch_scale'
我为armv7a编译了橡皮筋,并创建了一个静态库(rubberband.a)。 我检查了库,它包含了所需的符号(使用nm)。
我确认librubberband.a位于libpath(-L)
我验证了extern C存在于rubberband.c.h文件中。
有什么想法吗?
答案 0 :(得分:2)
错误发生在链接阶段。确保链接目录已添加到编译器的-L
参数中。
-L/directory/of/your/lib
并使用-l
选项指定库。
因此,在-L/directory/of/your/lib -lrubberband
支持ffmpeg
时,请确保为编译器设置了rubberband
选项。
如果您没有使用pkg-config
添加库。在构建之前配置ffmpeg时,可以使用选项--extra-ldflags
进行添加。
./configure \
# some configure options
--extra-ldflags="-L/directory/of/your/lib -lrubberband" \
# more configure options
如果您使用pkg-config
查找库。只需将library.pc
目录添加到PKG_CONFIG_PATH
,然后让构建系统完成剩下的工作。
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/directory/to/your/rubberband.pc
最后确保链接到图书馆的相同架构。
$ arm-linux-androideabi-readelf -h librubberband.a |grep 'Class\|Machine
对于armeabi-v7a
,它应为ELF32
和ARM
。
我从https://bitbucket.org/breakfastquay/rubberband
克隆了橡皮筋的来源发现函数调用rubberband_set_pitch_scale
是在src/rubberband-c.cpp
定义的,当为Android构建时,此文件未包含在Android.mk
中(为什么?)。
所以你必须添加这个文件来构建。
RUBBERBAND_SRC_FILES = ... \
$(RUBBERBAND_SRC_PATH)/rubberband-c.cpp
构建完成后,您需要创建如下所示的目录结构
.
├── include
│ └── rubberband
│ ├── RubberBandStretcher.h
│ └── rubberband-c.h
└── lib
├── librubberband.a
└── pkgconfig
└── rubberband.pc
文件rubberband.pc
已从rubberband.in.pc
复制,但稍作修改。
prefix=/path/to/rubberband/install/root
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: rubberband
Version: 1.8.1
Description:
Libs: -L${libdir} -lrubberband -L/path/to/android/ndk/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a -lgnustl_static
Cflags: -I${includedir}
然后添加
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/path/to/rubberband/install/root
在./configure
之前通过rubberband
告诉ffmpeg查找pkg-config
。
我尝试过最新的ffmpeg,它确实有用。