0

当我尝试链接 librubberband.a 时,我得到:libavfilter/af_rubberband.c:236: error: undefined reference to 'rubberband_set_pitch_scale'

  1. 我为 armv7a 编译了橡皮筋,并创建了一个静态库 (rubberband.a)。我检查了库,它包含所需的符号(使用 nm)。

  2. 我验证了 librubberband.a 在 libpath (-L) 中

  3. 我验证了extern C 存在于rubberband.ch 文件中。

有任何想法吗?

4

1 回答 1

2

错误发生在链接阶段。确保链接目录已添加到-L编译器的参数中。

-L/directory/of/your/lib

-l并使用选项指定库。

因此,请确保在-L/directory/of/your/lib -lrubberband构建时为您的编译器设置ffmpegrubberband支持选项。

如果你没有使用pkg-config添加库。您可以--extra-ldflags在构建前配置 ffmpeg 时使用添加选项。

./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,它应该是ELF32ARM

更新

我已经从https://bitbucket.org/breakfastquay/rubberband克隆了橡皮筋的来源

并发现函数调用rubberband_set_pitch_scale定义在src/rubberband-c.cpp,该文件不包含在Android.mk为 Android 构建时(为什么?)。

所以你必须添加这个文件来构建。

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告诉 ffmpeg find rubberbandby pkg-config

我尝试过最新的ffmpeg,它可以工作。

于 2017-06-28T07:33:52.860 回答