Ncnn: 编译Android aarch64版本的ncnn demo程序报错,感觉像是openmp那块出问题了。

Created on 7 Oct 2019  ·  4Comments  ·  Source: Tencent/ncnn

  1. 首先,我成功编译了Android aarch64版本的.a文件;
  2. 然后,在Android.mk里也加了以下编译选项:
    LOCAL_CFLAGS += -fopenmp
    LOCAL_CPPFLAGS += -fopenmp
    LOCAL_LDFLAGS += -fopenmp

    3. 但是,在我编译以下demo程序时,编译报错了。感觉openmp这一块出问题了。

include \

include \

include \

int main(int argc, char *argv[]) {
cv::Mat img = cv::imread("image.ppm", CV_LOAD_IMAGE_GRAYSCALE);
int w = img.cols;
int h = img.rows;
// subtract 128, norm to -1 ~ 1
ncnn::Mat in = ncnn::Mat::from_pixels_resize(img.data, ncnn::Mat::PIXEL_GRAY, w, h, 60, 60);
float mean[1] = { 128.f };
float norm[1] = { 1/128.f };
in.substract_mean_normalize(mean, norm);

ncnn::Net net;
net.load_param("model.param");
net.load_model("model.bin");

ncnn::Extractor ex = net.create_extractor();
ex.set_light_mode(true);
ex.set_num_threads(4);

ex.input("data", in);

ncnn::Mat feat;
ex.extract("output", feat);

return 0;

}

编译报错的部分LOG:
In function ncnn::AbsVal::forward_inplace(ncnn::Mat&, ncnn::Option const&) const': absval.cpp:(.text._ZNK4ncnn6AbsVal15forward_inplaceERNS_3MatERKNS_6OptionE+0x34): undefined reference to__kmpc_global_thread_num'
absval.cpp:(.text._ZNK4ncnn6AbsVal15forward_inplaceERNS_3MatERKNS_6OptionE+0x58): undefined reference to __kmpc_push_num_threads' absval.cpp:(.text._ZNK4ncnn6AbsVal15forward_inplaceERNS_3MatERKNS_6OptionE+0x78): undefined reference to__kmpc_fork_call'

Most helpful comment

Hi nihui. 这个libncnn.a编译报错的问题我自己找办法解决了。我这里把解决思路写一下,希望对后面需要的伙伴们有所帮助。大概操作流程如下:

  1. 指定NDK采用gcc/g++进行编译,禁用clang/clang++
    1)打开NDK对应cmake文件
    $ vim /opt/android-ndk-r16b/build/cmake/android.toolchain.cmake
    2)注释掉以下几行代码,只保留“set(ANDROID_TOOLCHAIN gcc)”
    #if(ANDROID_TOOLCHAIN_NAME AND NOT ANDROID_TOOLCHAIN)
    # if(ANDROID_TOOLCHAIN_NAME MATCHES "-clang([0-9].[0-9])?$")
    # set(ANDROID_TOOLCHAIN clang)
    # elseif(ANDROID_TOOLCHAIN_NAME MATCHES "-[0-9].[0-9]$")
    set(ANDROID_TOOLCHAIN gcc)
    # endif()
    #endif()
  1. 开始编译,注意必须添加这个宏定义-DANDROID_STL="c++_static"
    $ mkdir build; cd build
    $ cmake -DCMAKE_TOOLCHAIN_FILE="/opt/android-ndk-r16b/build/cmake/android.toolchain.cmake" -DANDROID_ABI="arm64-v8a" -DANDROID_PLATFORM="android-21" -DANDROID_STL="c++_static"
    ..
    $ make -j4
    $ make install

  2. Done! Enjoy ncnn!

All 4 comments

nihui,你好!问题是这样的,我采用NDK编译的ncnn库,然后又采用Android系统的编译工具链编译的demo程序。因为我是打算将这个ncnn库移植到我们Android系统的HAL层(编译成c/c++可执行程序)。我猜测应该是Android系统的编译工具链采用的是“gcc/g++”,而NDK采用的是“clang/clang++”,所以才出现编译报错。
不知道你们是否有针对这种应用场景有相对的编译方案,谢谢。

Hi nihui. 这个libncnn.a编译报错的问题我自己找办法解决了。我这里把解决思路写一下,希望对后面需要的伙伴们有所帮助。大概操作流程如下:

  1. 指定NDK采用gcc/g++进行编译,禁用clang/clang++
    1)打开NDK对应cmake文件
    $ vim /opt/android-ndk-r16b/build/cmake/android.toolchain.cmake
    2)注释掉以下几行代码,只保留“set(ANDROID_TOOLCHAIN gcc)”
    #if(ANDROID_TOOLCHAIN_NAME AND NOT ANDROID_TOOLCHAIN)
    # if(ANDROID_TOOLCHAIN_NAME MATCHES "-clang([0-9].[0-9])?$")
    # set(ANDROID_TOOLCHAIN clang)
    # elseif(ANDROID_TOOLCHAIN_NAME MATCHES "-[0-9].[0-9]$")
    set(ANDROID_TOOLCHAIN gcc)
    # endif()
    #endif()
  1. 开始编译,注意必须添加这个宏定义-DANDROID_STL="c++_static"
    $ mkdir build; cd build
    $ cmake -DCMAKE_TOOLCHAIN_FILE="/opt/android-ndk-r16b/build/cmake/android.toolchain.cmake" -DANDROID_ABI="arm64-v8a" -DANDROID_PLATFORM="android-21" -DANDROID_STL="c++_static"
    ..
    $ make -j4
    $ make install

  2. Done! Enjoy ncnn!

cheers !

Was this page helpful?
0 / 5 - 0 ratings

Related issues

SisterL picture SisterL  ·  3Comments

soham24 picture soham24  ·  3Comments

Abel119 picture Abel119  ·  4Comments

chouhongzao picture chouhongzao  ·  4Comments

makaaay picture makaaay  ·  4Comments