About compiling kaldi .so files for Android (arm) platform

303 views
Skip to first unread message

Sean Zhou

unread,
Jun 27, 2019, 11:19:34 AM6/27/19
to kaldi-help
Hi all,

I've compiled the static library files successfully for Android (arch ARM ) following the steps in https://jcsilva.github.io/2017/03/18/compile-kaldi-android/.

File path relative to src folder:

.//tree/kaldi-tree.a
.//gmm/kaldi-gmm.a
.//online2/kaldi-online2.a
.//util/kaldi-util.a
.//feat/kaldi-feat.a
.//lm/kaldi-lm.a
.//sgmm2/kaldi-sgmm2.a
.//rnnlm/kaldi-rnnlm.a
.//nnet/kaldi-nnet.a
.//decoder/kaldi-decoder.a
.//nnet2/kaldi-nnet2.a
.//chain/kaldi-chain.a
.//nnet3/kaldi-nnet3.a
.//cudamatrix/kaldi-cudamatrix.a
.//ivector/kaldi-ivector.a
.//kws/kaldi-kws.a
.//hmm/kaldi-hmm.a
.//lat/kaldi-lat.a
.//fstext/kaldi-fstext.a
.//transform/kaldi-transform.a
.//matrix/kaldi-matrix.a
.//base/kaldi-base.a


However, is there another way to build dynamic library (.so on linux) files ? I've tried modifying src/configure  from :
--android-incdir=*)
android=true;
threaded_math=false;
static_math=true;
static_fst=true;
dynamic_kaldi=false;

to :

--android-incdir=*)
android=true;
threaded_math=false;
static_math=true;
static_fst=true;
dynamic_kaldi=true;//

and updated last compile command to :

CXX=clang++ ./configure --shared --android-incdir=/tmp/my-android-toolchain/sysroot/usr/include/ --host=arm-linux-androideabi --openblas-root=/path-to/OpenBLAS/install

But failed with an error :

clang80++: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [libkaldi-matrix.dylib] Error 1

Could you help me on that, thanks in advance!

Jan Trmal

unread,
Jun 27, 2019, 11:23:55 AM6/27/19
to kaldi-help
there was probably error message before this error.
y.

--
Go to http://kaldi-asr.org/forums.html find out how to join
---
You received this message because you are subscribed to the Google Groups "kaldi-help" group.
To unsubscribe from this group and stop receiving emails from it, send an email to kaldi-help+...@googlegroups.com.
To post to this group, send email to kaldi...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/kaldi-help/9c45de08-0ce3-4938-80a1-f7221e2d7e94%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Shihao Zhou

unread,
Jun 27, 2019, 12:16:58 PM6/27/19
to kaldi...@googlegroups.com
error message before this error :

arm-linux-androideabi-clang++ -dynamiclib -o libkaldi-matrix.dylib -install_name @rpath/libkaldi-matrix.dylib   -Wl,--no-warn-mismatch -pie -Wl,-rpath -Wl,/Users/rayworks/Documents/tools/kaldi/src/lib kaldi-matrix.o kaldi-vector.o packed-matrix.o sp-matrix.o tp-matrix.o matrix-functions.o qr.o srfft.o compressed-matrix.o sparse-matrix.o optimization.o  ../base/libkaldi-base.dylib /Users/rayworks/Documents/tools/kaldi/tools/openfst-1.6.7/lib/libfst.a /Users/rayworks/Documents/workspace/OpenBLAS/install/lib/libopenblas.a /Users/rayworks/Documents/workspace/OpenBLAS/install/lib/libclapack.a /Users/rayworks/Documents/workspace/OpenBLAS/install/lib/liblapack.a /Users/rayworks/Documents/workspace/OpenBLAS/install/lib/libblas.a /Users/rayworks/Documents/workspace/OpenBLAS/install/lib/libf2c.a -lm -ldl
clang80++: warning: argument unused during compilation: '-dynamiclib' [-Wunused-command-line-argument]
clang80++: warning: argument unused during compilation: '-install_name @rpath/libkaldi-matrix.dylib' [-Wunused-command-line-argument]
kaldi-vector.cc:77: error: undefined reference to 'kaldi::KaldiAssertFailure_(char const*, char const*, int, char const*)'
kaldi-vector.cc:78: error: undefined reference to 'kaldi::KaldiAssertFailure_(char const*, char const*, int, char const*)'
kaldi-vector.cc:86: error: undefined reference to 'kaldi::KaldiAssertFailure_(char const*, char const*, int, char const*)'
kaldi-vector.cc:87: error: undefined reference to 'kaldi::KaldiAssertFailure_(char const*, char const*, int, char const*)'
kaldi-vector.cc:1117: error: undefined reference to 'kaldi::Peek(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool)'
kaldi-vector.cc:1129: error: undefined reference to 'kaldi::ReadToken(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*)'
kaldi-vector.cc:1201: error: undefined reference to 'kaldi::MessageLogger::MessageLogger(kaldi::LogMessageEnvelope::Severity, char const*, char const*, int)'
kaldi-vector.cc:1204: error: undefined reference to 'kaldi::MessageLogger::MessageLogger(kaldi::LogMessageEnvelope::Severity, char const*, char const*, int)'
kaldi-vector.cc:1186: error: undefined reference to 'kaldi::MessageLogger::MessageLogger(kaldi::LogMessageEnvelope::Severity, char const*, char const*, int)'
kaldi-vector.cc:1106: error: undefined reference to 'kaldi::MessageLogger::MessageLogger(kaldi::LogMessageEnvelope::Severity, char const*, char const*, int)'
kaldi-vector.cc:1117: error: undefined reference to 'kaldi::Peek(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool)'
kaldi-vector.cc:1129: error: undefined reference to 'kaldi::ReadToken(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*)'
kaldi-vector.cc:302: error: undefined reference to 'kaldi::RandomState::RandomState()'
kaldi-vector.cc:305: error: undefined reference to 'kaldi::RandGauss2(float*, float*, kaldi::RandomState*)'
kaldi-vector.cc:312: error: undefined reference to 'kaldi::RandomState::RandomState()'
kaldi-vector.cc:320: error: undefined reference to 'kaldi::RandomState::RandomState()'
kaldi-vector.cc:1228: error: undefined reference to 'kaldi::WriteToken(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)'
kaldi-vector.cc:302: error: undefined reference to 'kaldi::RandomState::RandomState()'
kaldi-vector.cc:305: error: undefined reference to 'kaldi::RandGauss2(double*, double*, kaldi::RandomState*)'
kaldi-vector.cc:1228: error: undefined reference to 'kaldi::WriteToken(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)'
packed-matrix.cc:316: error: undefined reference to 'kaldi::Peek(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool)'
packed-matrix.cc:333: error: undefined reference to 'kaldi::ReadToken(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*)'
packed-matrix.cc:351: error: undefined reference to 'void kaldi::ReadBasicType<float>(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, float*)'
packed-matrix.cc:316: error: undefined reference to 'kaldi::Peek(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool)'
packed-matrix.cc:333: error: undefined reference to 'kaldi::ReadToken(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >*)'
packed-matrix.cc:351: error: undefined reference to 'void kaldi::ReadBasicType<double>(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, double*)'
packed-matrix.cc:247: error: undefined reference to 'kaldi::WriteToken(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)'
packed-matrix.cc:261: error: undefined reference to 'void kaldi::WriteBasicType<float>(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, float)'
packed-matrix.cc:247: error: undefined reference to 'kaldi::WriteToken(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)'
packed-matrix.cc:261: error: undefined reference to 'void kaldi::WriteBasicType<double>(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, double)'
compressed-matrix.cc:548: error: undefined reference to 'kaldi::WriteToken(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, char const*)'
compressed-matrix.cc:0: error: undefined reference to 'kaldi::WriteToken(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, char const*)'
../base/kaldi-error.h:133: error: undefined reference to 'kaldi::MessageLogger::LogMessage() const'
../base/kaldi-error.h:126: error: undefined reference to 'kaldi::MessageLogger::LogMessage() const'
../base/kaldi-error.h:0: error: undefined reference to 'kaldi::g_kaldi_verbose_level'
kaldi-matrix.cc:1361: error: undefined reference to 'kaldi::RandGauss2(float*, float*, kaldi::RandomState*)'
../base/kaldi-math.h:152: error: undefined reference to 'kaldi::Rand(kaldi::RandomState*)'
kaldi-matrix.cc:1361: error: undefined reference to 'kaldi::RandGauss2(double*, double*, kaldi::RandomState*)'
sparse-matrix.cc:275: error: undefined reference to 'kaldi::WithProb(float, kaldi::RandomState*)'
sparse-matrix.cc:149: error: undefined reference to 'kaldi::WriteToken(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, char const*)'
sparse-matrix.cc:157: error: undefined reference to 'void kaldi::WriteBasicType<float>(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, float)'
sparse-matrix.cc:175: error: undefined reference to 'kaldi::ExpectToken(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, char const*)'
sparse-matrix.cc:186: error: undefined reference to 'void kaldi::ReadBasicType<float>(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, float*)'
sparse-matrix.cc:275: error: undefined reference to 'kaldi::WithProb(float, kaldi::RandomState*)'
sparse-matrix.cc:149: error: undefined reference to 'kaldi::WriteToken(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, char const*)'
sparse-matrix.cc:157: error: undefined reference to 'void kaldi::WriteBasicType<double>(std::__ndk1::basic_ostream<char, std::__ndk1::char_traits<char> >&, bool, double)'
sparse-matrix.cc:175: error: undefined reference to 'kaldi::ExpectToken(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, char const*)'
sparse-matrix.cc:186: error: undefined reference to 'void kaldi::ReadBasicType<double>(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, double*)'
sparse-matrix.cc:469: error: undefined reference to 'kaldi::ExpectToken(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, char const*)'
sparse-matrix.cc:469: error: undefined reference to 'kaldi::ExpectToken(std::__ndk1::basic_istream<char, std::__ndk1::char_traits<char> >&, bool, char const*)'

clang80++: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [libkaldi-matrix.dylib] Error 1
make: *** [matrix] Error 2

Jan Trmal <jtr...@gmail.com> 于2019年6月27日周四 下午11:23写道:

Justin Luitjens

unread,
Jun 27, 2019, 1:01:20 PM6/27/19
to kaldi...@googlegroups.com
Are there ordering requirements for ADDLIBS that I perhaps am not following?  These are all linking errors to functions that must exist and should be coming from ../matrix/kaldi-matrix.a

Daniel Povey

unread,
Jun 27, 2019, 1:23:15 PM6/27/19
to kaldi-help
Those should be coming from libkaldi-base.  It's on the command line but I don't know if just putting the .dylib as an argument like that is how you do it.

Shihao Zhou

unread,
Jun 27, 2019, 8:41:57 PM6/27/19
to kaldi...@googlegroups.com
Hi guys, thanks for your replies. I just found the issue for current cross-compiling, there is a file "default_rules.mk" under "src/makefiles/"

ifeq ($(KALDI_FLAVOR), dynamic)
  ifeq ($(shell uname), Darwin)
    ifdef LIBNAME
      LIBFILE = lib$(LIBNAME).dylib

    endif
    LDFLAGS += -Wl,-rpath -Wl,$(KALDILIBDIR)
    EXTRA_LDLIBS += $(foreach dep,$(ADDLIBS), $(dir $(dep))lib$(notdir $(basename $(dep))).dylib)
  else ifeq ($(shell uname), Linux)
    ifdef LIBNAME
      LIBFILE = lib$(LIBNAME).so
    endif
    LDFLAGS += -Wl,-rpath=$(shell readlink -f $(KALDILIBDIR))
    EXTRA_LDLIBS += $(foreach dep,$(ADDLIBS), $(dir $(dep))lib$(notdir $(basename $(dep))).so)
  else  # Platform not supported
    $(error Dynamic libraries not supported on this platform. Run configure with --static flag.)
  endif

Actually, for my case, it's not reliable to detect the platform by 'uname'.

Daniel Povey <dpo...@gmail.com> 于2019年6月28日周五 上午1:23写道:

Daniel Povey

unread,
Jun 28, 2019, 2:04:22 PM6/28/19
to kaldi-help
Oh.  I don't really keep on top of cross-compilation issues.  If you have a fix I'll consider merging it though.


Shihao Zhou

unread,
Jun 28, 2019, 9:20:30 PM6/28/19
to kaldi...@googlegroups.com
Thanks @Daniel, I will make a fix for it.

Daniel Povey <dpo...@gmail.com> 于2019年6月29日周六 上午2:04写道:
Reply all
Reply to author
Forward
0 new messages