synthfluid的编译arm,arm64

fluidsynth的编译arm,arm64

编译arm

  1. 登录fluidsynth,查看android的编译。https://github.com/FluidSynth/fluidsynth/wiki/BuildingForAndroid
    点击此处直达
  2. android要求,下载两个文件fluid-android-prepare.sh和fluid-android-compile.sh
    第一个文件,用于准备编译所需的环境,第二个文件,下载相应的依赖包以及fluidsynth的源码包,并进行编译
  3. 下载android ndk-r17c.
  4. 修改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
  1. 现在开始运行prepare文件如下:
$ source ./fluid-android-prepare2.sh 

注意:因为我这里对prepare文件又修改,故名字变成了fluid-android-prepare2.sh

  1. 运行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

  1. 接下来编译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
  1. 修改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
  1. 因为上一次,编译的时候,产生了各种中间文件,因此,在所有的make指令之前,添加make clean指令。
  2. oboe和fluidsysnth的编译需要建立build文件,因此,在mkdir build之前,加上
test -d build && rm -rf build
  1. 接下来,删除$PREFIX里面的所有生成文件,并再次运行prepare文件,和compile文件.
  2. 出现如下的错误:
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
)

再次编译,成功。

  1. 查看arm64下的编译结果,依然在$PREFIX下面
  2. 接下来任意修改fluidsynth,即可畅享代码带来的愉悦啦
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值