fluidsynth的编译arm,arm64
编译arm
- 登录fluidsynth,查看android的编译。https://github.com/FluidSynth/fluidsynth/wiki/BuildingForAndroid
点击此处直达 - android要求,下载两个文件fluid-android-prepare.sh和fluid-android-compile.sh
第一个文件,用于准备编译所需的环境,第二个文件,下载相应的依赖包以及fluidsynth的源码包,并进行编译 - 下载android ndk-r17c.
- 修改fluid-android-prepare.sh文件,将本机里面的android sdk目录,和ndk目录,分别赋值给DEV和NDK变量,如下:
# Android NDK sources and standalone toolchain is put here
export DEV=${HOME}/Android/Sdk
# This is a symlink pointing to the real Android NDK r10e
export NDK=${DEV}/android-ndk-r17c
- 现在开始运行prepare文件如下:
$ source ./fluid-android-prepare2.sh
注意:因为我这里对prepare文件又修改,故名字变成了fluid-android-prepare2.sh
- 运行fluid-android-compile.sh开始进行下载和编译,如下:
$ bash ./fluid-android-compile2.sh
+ /home/wanbiao/Android/Sdk/android-ndk-r17c/build/tools/make_standalone_toolchain.py --arch arm64 --api 26 --stl=libc++ --install-dir=/home/wanbiao/Android/Sdk/android-ndk-toolchain --force
+ libiconvversion=1.14
+ wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
--2021-06-23 14:28:49-- http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
Resolving ftp.gnu.org (ftp.gnu.org)... 209.51.188.20, 2001:470:142:3::b
Connecting to ftp.gnu.org (ftp.gnu.org)|209.51.188.20|:80...
等待一段时间,编译结束
产生的各种二进制和库,存在了$PREFIX下面如下:
$ echo $PREFIX
/home/wanbiao/Android/Sdk/opt/android
$ ls $PREFIX
bin include lib share
而我需要的libfluidsynth.so库,即在lib目录下
编译arm64
- 接下来编译arm64,需要先修改prepare文件,将ANDROID_ARCH赋值为arm64;ANDROID_TARGET赋值为aarch64-linux-android;TARGET赋值为aarch64-linux-android;ANDROID_ABI_CMAKE赋值为arm64-v8a。如下:
export ANDROID_ARCH=arm64
export ANDROID_TARGET=aarch64-linux-android
export TARGET=aarch64-linux-android
export ANDROID_ABI_CMAKE=arm64-v8a
- 修改compile文件,因为libiconv-1.14无法进行64位的编译,因此,将其替换成1.16.进行如下的修改:
libiconvversion=1.16
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${libiconvversion}.tar.gz
tar zxvf libiconv-${libiconvversion}.tar.gz
pushd libiconv-${libiconvversion}
./configure --host=${TARGET} --prefix=${PREFIX} --disable-rpath
make clean
make -j4
make install
popd
同时,因为在我的本地编译gettext-0.19.8.1报错,因此将其替换成0.20如下:
gettextversion=0.20
wget http://ftp.gnu.org/pub/gnu/gettext/gettext-${gettextversion}.tar.gz
tar zxvf gettext-${gettextversion}.tar.gz
pushd gettext-${gettextversion}
./configure --host=${TARGET} --prefix=${PREFIX} --disable-rpath --disable-libasprintf --disable-java --disable-native-java --disable-openmp --disable-curses
make clean
make -j4
make install
popd
- 因为上一次,编译的时候,产生了各种中间文件,因此,在所有的make指令之前,添加make clean指令。
- oboe和fluidsysnth的编译需要建立build文件,因此,在mkdir build之前,加上
test -d build && rm -rf build
- 接下来,删除$PREFIX里面的所有生成文件,并再次运行prepare文件,和compile文件.
- 出现如下的错误:
warning: libffi.so.6, needed by ./.libs/libgobject-2.0.so, not found (try using -rpath or -rpath-link)
./.libs/libgobject-2.0.so: undefined reference to `ffi_type_float'
经过仔细的查看LDFLAGS已经包含了必要的文件,因此,将libffi.so文件复制到根目录下。即${NDK_TOOLCHAIN}/sysroot/usr/lib目录下。
而生成的libffi.so,在$PREFIX中
做如下的操作:
cp -a ${PREFIX}/lib/* ${NDK_TOOLCHAIN}/sysroot/usr/lib/
完成之后,还需要保证根目录不会被重建,即compile文件中的standalone语句注释掉如下:
# Create a standalone toolchain first, see https://developer.android.com/ndk/guides/standalone_toolchain
#${NDK}/build/tools/make_standalone_toolchain.py --arch ${ANDROID_ARCH} --api ${ANDROID_API} --stl=libc++ --install-dir=${NDK_TOOLCHAIN} --force
重新运行compile文件。
注意:在重新运行之前,可以将下载和解压的过程注释掉
第二次遇到如下的报错:
warning: libgmodule-2.0.so, needed by ./.libs/libgio-2.0.so, not found (try using -rpath or -rpath-link)
./.libs/libgio-2.0.so: undefined reference to `g_module_error'
查找libgmodule-2.0.so,并将其复制到根目录下如下:
dir=$(find . -name libgmodule-2.0.so -exec dirname {} \;)&& cp -a $dir/* $NDK_TOOLCHAIN/sysroot/usr/lib/
继续编译
注意:可以将已经编译通过的包,注释掉,以减少编译的等待时间
接下来发现,在编译fluidsynth的时候,报如下的错误:
warning: libiconv.so, needed by /home/wanbiao/Android/Sdk/opt/android/lib/libglib-2.0.so, not found (try using -rpath or -rpath-link)
/home/wanbiao/Android/Sdk/opt/android/lib/libintl.so: undefined reference to `libiconv_set_relocation_prefix'
通过打印LDFLAGAS,以及查看根目录,确认libiconv.so文件已经存在,那么剩下的就是,在编译fluidysynth时,没有写好依赖库。现在修改fluidsynth的CMakeLists.txt文件位于:./fluidsynth/fluidsynth-2.1.1/src/CMakeLists.txt下。
通过编译的log,看一找到,是在链接目标fluidsynth时出错,因此,直接找到fluidsynth的位置,如下,并将iconv添加进去,即可,如下:
set ( fluidsynth_SOURCES fluidsynth.c )
add_executable ( fluidsynth
${fluidsynth_SOURCES}
)
if ( FLUID_CPPFLAGS )
set_target_properties ( fluidsynth
PROPERTIES COMPILE_FLAGS ${FLUID_CPPFLAGS} )
endif ( FLUID_CPPFLAGS )
## add iconv
target_link_libraries ( fluidsynth
libfluidsynth
${SYSTEMD_LIBRARIES}
${FLUID_LIBS}
iconv
)
再次编译,成功。
- 查看arm64下的编译结果,依然在$PREFIX下面
- 接下来任意修改fluidsynth,即可畅享代码带来的愉悦啦