mace: Android Kaldi: undefined reference to `mace::CreateMaceEngineFromProto

Before you open an issue, please make sure you have tried the following steps:

  1. Make sure your environment is the same with (https://mace.readthedocs.io/en/latest/installation/env_requirement.html).
  2. Have you ever read the document for your usage?
  3. Check if your issue appears in HOW-TO-DEBUG or FAQ.
  4. The form below must be filled.

System information

  • Android Arch: arm64-v8a
  • Android API: 26
  • OS Platform and Distribution (e.g., Linux Ubuntu 16.04): Linux Ubuntu 16.04
  • NDK version(e.g., 15c): r15c
  • GCC version(if compiling for host, e.g., 5.4.0): 5.4.0
  • MACE version (Use the command: git describe --long --tags): v0.11.0-rc1
  • Python version(2.7): 3.7
  • Bazel version (e.g., 0.13.0): 0.16.0

Model deploy file (*.yml)

......

Describe the problem

Fisrt, i build the offical docker in Mace-Master project, and go to the examples/android dir, run the build.sh, and copy the .so library in examples/android/macelibrary/src/main/jniLibs/arm64-v8a to /path/to/kaldi/tools/libmace. Also, i copy the mace include to /path/to/kaldi/tools/libmace. Then, i modify the docker file(/path/to/mace-kit/tool/kaldi/docker) in Mace-Kit-Master project to arm64-v8a and successfulyy build the docker. Finally, i run the complie-kaldi.sh (both static and shared way has been tried), and the kaldi code is built successfully(e.g. libkaldi-decoder.so libkaldi-nnet3.so ) The problem is, when i want to build the mace and macebin dir, it fails(but i can get the .o file and pack it to kaldi-mace.a).

/opt/kaldi/src/mace# ls …/…/tools/libmace/include/mace/ port/ public/ utils/ /opt/kaldi/src/mace# ls …/…/tools/libmace/include/mace/public/ mace.h

To Reproduce

Steps to reproduce the problem:

1. cd /path/to/mace
2. python tools/converter.py convert --config_file=/path/to/your/model_deployment_file

Error information / logs

Please include the full log and/or traceback here.

...
aarch64-linux-android-clang++ -std=c++11 -I.. -I/opt/kaldi/tools/openfst-1.6.7/include -O1  -Wall -Wno-sign-compare -Wno-unused-local-typedefs -Wno-deprecated-declarations -Winit-self -Wno-mismatched-tags -DKALDI_DOUBLEPRECISION=0 -DHAVE_CXXABI_H -DHAVE_OPENBLAS -DANDROID_BUILD -I/opt/OpenBLAS/install/include -I/tmp/my-android-toolchain/sysroot/usr/include -ftree-vectorize -mfloat-abi=softfp -mfpu=neon -pthread -g  -fPIC -DHAVE_MACE -I/opt/kaldi/tools/libmace/include   -c -o mace-online-nnet2-decodable.o mace-online-nnet2-decodable.cc
clang50++: warning: argument unused during compilation: '-mfloat-abi=softfp' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfpu=neon' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfloat-abi=softfp' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfpu=neon' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfloat-abi=softfp' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfpu=neon' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfloat-abi=softfp' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfpu=neon' [-Wunused-command-line-argument]
aarch64-linux-android-clang++ -std=c++11 -I.. -I/opt/kaldi/tools/openfst-1.6.7/include -O1  -Wall -Wno-sign-compare -Wno-unused-local-typedefs -Wno-deprecated-declarations -Winit-self -Wno-mismatched-tags -DKALDI_DOUBLEPRECISION=0 -DHAVE_CXXABI_H -DHAVE_OPENBLAS -DANDROID_BUILD -I/opt/OpenBLAS/install/include -I/tmp/my-android-toolchain/sysroot/usr/include -ftree-vectorize -mfloat-abi=softfp -mfpu=neon -pthread -g  -fPIC -DHAVE_MACE -I/opt/kaldi/tools/libmace/include   -c -o mace-online-nnet2-decoding.o mace-online-nnet2-decoding.cc
clang50++: warning: argument unused during compilation: '-mfloat-abi=softfp' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfpu=neon' [-Wunused-command-line-argument]
aarch64-linux-android-clang++ -std=c++11 -I.. -I/opt/kaldi/tools/openfst-1.6.7/include -O1  -Wall -Wno-sign-compare -Wno-unused-local-typedefs -Wno-deprecated-declarations -Winit-self -Wno-mismatched-tags -DKALDI_DOUBLEPRECISION=0 -DHAVE_CXXABI_H -DHAVE_OPENBLAS -DANDROID_BUILD -I/opt/OpenBLAS/install/include -I/tmp/my-android-toolchain/sysroot/usr/include -ftree-vectorize -mfloat-abi=softfp -mfpu=neon -pthread -g  -fPIC -DHAVE_MACE -I/opt/kaldi/tools/libmace/include   -c -o mace-online-nnet3-decoding.o mace-online-nnet3-decoding.cc
aarch64-linux-android-clang++ -std=c++11 -I.. -I/opt/kaldi/tools/openfst-1.6.7/include -O1  -Wall -Wno-sign-compare -Wno-unused-local-typedefs -Wno-deprecated-declarations -Winit-self -Wno-mismatched-tags -DKALDI_DOUBLEPRECISION=0 -DHAVE_CXXABI_H -DHAVE_OPENBLAS -DANDROID_BUILD -I/opt/OpenBLAS/install/include -I/tmp/my-android-toolchain/sysroot/usr/include -ftree-vectorize -mfloat-abi=softfp -mfpu=neon -pthread -g  -fPIC -DHAVE_MACE -I/opt/kaldi/tools/libmace/include   -c -o kaldi-mace.o kaldi-mace.cc
clang50++: warning: argument unused during compilation: '-mfloat-abi=softfp' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfpu=neon' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfloat-abi=softfp' [-Wunused-command-line-argument]
clang50++: warning: argument unused during compilation: '-mfpu=neon' [-Wunused-command-line-argument]
aarch64-linux-android-ar -cr kaldi-mace.a mace-computer.o mace-am-decodable-simple.o mace-decodable-simple-looped.o mace-decodable-online-looped.o mace-online-nnet2-decodable.o mace-online-nnet2-decoding.o mace-online-nnet3-decoding.o kaldi-mace.o
aarch64-linux-android-ranlib kaldi-mace.a
aarch64-linux-android-clang++ -shared -o libkaldi-mace.so -Wl,--no-undefined -Wl,--as-needed  -Wl,-soname=libkaldi-mace.so,--whole-archive kaldi-mace.a -Wl,--no-whole-archive   -Wl,--no-warn-mismatch -pie  -Wl,-rpath=/opt/kaldi/tools/libmace -Wl,-s -fvisibility=hidden -fvisibility-inlines-hidden -fno-rtti -Wl,-rpath=/opt/kaldi/src/lib  ../online2/kaldi-online2.a  ../ivector/kaldi-ivector.a  ../decoder/kaldi-decoder.a  ../lat/kaldi-lat.a  ../feat/kaldi-feat.a  ../fstext/kaldi-fstext.a  ../hmm/kaldi-hmm.a  ../gmm/kaldi-gmm.a  ../tree/kaldi-tree.a  ../util/kaldi-util.a  ../matrix/kaldi-matrix.a  ../transform/kaldi-transform.a  ../base/kaldi-base.a /opt/kaldi/tools/openfst-1.6.7/lib/libfst.a /opt/OpenBLAS/install/lib/libopenblas.a /opt/OpenBLAS/install/lib/libclapack.a /opt/OpenBLAS/install/lib/liblapack.a /opt/OpenBLAS/install/lib/libblas.a /opt/OpenBLAS/install/lib/libf2c.a -lm -ldl  -L/opt/kaldi/tools/libmace -lmace
clang50++: warning: argument unused during compilation: '-pie' [-Wunused-command-line-argument]
kaldi-mace.a(mace-computer.o): In function `kaldi::MACE::MaceComputer::InitEngine(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)':
/opt/kaldi/src/mace/mace-computer.cc:217: undefined reference to `mace::CreateMaceEngineFromProto(unsigned char const*, unsigned long, unsigned char const*, unsigned long, std::__ndk1::vector<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >, std::__ndk1::allocator<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > > > const&, std::__ndk1::vector<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >, std::__ndk1::allocator<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > > > const&, mace::MaceEngineConfig const&, std::__ndk1::shared_ptr<mace::MaceEngine>*)'
kaldi-mace.a(mace-computer.o): In function `kaldi::MACE::MaceComputer::InitTensors()':
/opt/kaldi/src/mace/mace-computer.cc:247: undefined reference to `mace::MaceTensor::MaceTensor(std::__ndk1::vector<long, std::__ndk1::allocator<long> > const&, std::__ndk1::shared_ptr<void>, mace::DataFormat)'
/opt/kaldi/src/mace/mace-computer.cc:258: undefined reference to `mace::MaceTensor::MaceTensor(std::__ndk1::vector<long, std::__ndk1::allocator<long> > const&, std::__ndk1::shared_ptr<void>, mace::DataFormat)'
/opt/kaldi/src/mace/mace-computer.cc:270: undefined reference to `mace::MaceTensor::MaceTensor(std::__ndk1::vector<long, std::__ndk1::allocator<long> > const&, std::__ndk1::shared_ptr<void>, mace::DataFormat)'
/opt/kaldi/src/mace/mace-computer.cc:277: undefined reference to `mace::MaceTensor::MaceTensor(std::__ndk1::vector<long, std::__ndk1::allocator<long> > const&, std::__ndk1::shared_ptr<void>, mace::DataFormat)'
kaldi-mace.a(mace-am-decodable-simple.o): In function `kaldi::MACE::MaceComputer::Run()':
/opt/kaldi/src/mace/./mace-computer.h:161: undefined reference to `mace::MaceEngine::Run(std::__ndk1::map<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >, mace::MaceTensor, std::__ndk1::less<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > >, std::__ndk1::allocator<std::__ndk1::pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const, mace::MaceTensor> > > const&, std::__ndk1::map<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >, mace::MaceTensor, std::__ndk1::less<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > >, std::__ndk1::allocator<std::__ndk1::pair<std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const, mace::MaceTensor> > >*)'
clang50++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [libkaldi-mace.so] Error 1
...

Additional context

The kaldi.mk file

# This file was generated using the following command:
# ./configure --shared --use-cuda=no --mace-libdir=/opt/kaldi/tools/libmace/ --mace-incdir=/opt/kaldi/tools/libmace/include/ --fst-root=/opt/kaldi/tools/openfst-1.6.7 --android-incdir=/tmp/my-android-toolchain/sysroot/usr/include/ --host=aarch64-linux-android --openblas-root=/opt/OpenBLAS/install

CONFIGURE_VERSION := 11

# Toolchain configuration

CXX = aarch64-linux-android-clang++
AR = aarch64-linux-android-ar
AS = aarch64-linux-android-as
RANLIB = aarch64-linux-android-ranlib


KALDI_FLAVOR := dynamic
KALDILIBDIR := /opt/kaldi/src/lib
DOUBLE_PRECISION = 0
OPENFSTINC = /opt/kaldi/tools/openfst-1.6.7/include

CXXFLAGS += -fPIC
OPENFSTLIBS = /opt/kaldi/tools/openfst-1.6.7/lib/libfst.a
OPENFSTLDFLAGS = 

CUBROOT = /opt/kaldi/tools/cub-1.8.0
OPENBLASINC = /opt/OpenBLAS/install/include
OPENBLASLIBS = /opt/OpenBLAS/install/lib/libopenblas.a /opt/OpenBLAS/install/lib/libclapack.a /opt/OpenBLAS/install/lib/liblapack.a /opt/OpenBLAS/install/lib/libblas.a /opt/OpenBLAS/install/lib/libf2c.a
ANDROIDINC = /tmp/my-android-toolchain/sysroot/usr/include

ifndef DOUBLE_PRECISION
$(error DOUBLE_PRECISION not defined.)
endif
ifndef OPENFSTINC
$(error OPENFSTINC not defined.)
endif
ifndef OPENFSTLIBS
$(error OPENFSTLIBS not defined.)
endif
ifndef OPENBLASINC
$(error OPENBLASINC not defined.)
endif
ifndef OPENBLASLIBS
$(error OPENBLASLIBS not defined.)
endif
ifndef ANDROIDINC
$(error ANDROIDINC not defined.)
endif

COMPILER = $(shell $(CXX) -v 2>&1)
ifneq ($(findstring clang,$(COMPILER)),clang)
$(error Android build does not support compiling with $(CXX).
        Supported compilers: clang++)
endif

CXXFLAGS = -std=c++11 -I.. -I$(OPENFSTINC) -O1 $(EXTRA_CXXFLAGS) \
           -Wall -Wno-sign-compare -Wno-unused-local-typedefs \
           -Wno-deprecated-declarations -Winit-self -Wno-mismatched-tags \
           -DKALDI_DOUBLEPRECISION=$(DOUBLE_PRECISION) \
           -DHAVE_CXXABI_H -DHAVE_OPENBLAS -DANDROID_BUILD \
           -I$(OPENBLASINC) -I$(ANDROIDINC) -ftree-vectorize -mfloat-abi=softfp \
           -mfpu=neon -pthread \
           -g # -O0 -DKALDI_PARANOID

ifeq ($(KALDI_FLAVOR), dynamic)
CXXFLAGS += -fPIC
endif

LDFLAGS = $(EXTRA_LDFLAGS) $(OPENFSTLDFLAGS) -Wl,--no-warn-mismatch -pie
LDLIBS = $(EXTRA_LDLIBS) $(OPENFSTLIBS) $(OPENBLASLIBS) -lm -ldl

CXXFLAGS += -DHAVE_MACE -I/opt/kaldi/tools/libmace/include
MACE_LDLIBS += -L/opt/kaldi/tools/libmace -lmace
MACE_LDFLAGS += -Wl,-rpath=/opt/kaldi/tools/libmace -Wl,-s -fvisibility=hidden -fvisibility-inlines-hidden -fno-rtti

The Makefile for mace

all:

include ../kaldi.mk

LDFLAGS += $(CUDA_LDFLAGS)
LDLIBS += $(CUDA_LDLIBS)

LDLIBS += $(MACE_LDLIBS)
LDFLAGS += $(MACE_LDFLAGS)

TESTFILES =

# BINFILES = mace-online-decode

OBJFILES = mace-computer.o mace-am-decodable-simple.o mace-decodable-simple-looped.o \
           mace-decodable-online-looped.o mace-online-nnet2-decodable.o \
           mace-online-nnet2-decoding.o mace-online-nnet3-decoding.o kaldi-mace.o

LIBNAME = kaldi-mace

ADDLIBS = ../online2/kaldi-online2.a ../ivector/kaldi-ivector.a \
          ../decoder/kaldi-decoder.a ../lat/kaldi-lat.a ../feat/kaldi-feat.a \
          ../fstext/kaldi-fstext.a ../hmm/kaldi-hmm.a ../gmm/kaldi-gmm.a ../tree/kaldi-tree.a \
          ../util/kaldi-util.a ../matrix/kaldi-matrix.a ../transform/kaldi-transform.a\
          ../base/kaldi-base.a

include ../makefiles/mace_rules.mk

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 18

Most upvoted comments

@lu229 okay got it, and thanks for your help and advice these days