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'
建议参考这里的demo
https://github.com/nihui/ncnn-android-squeezenet
nihui,你好!问题是这样的,我采用NDK编译的ncnn库,然后又采用Android系统的编译工具链编译的demo程序。因为我是打算将这个ncnn库移植到我们Android系统的HAL层(编译成c/c++可执行程序)。我猜测应该是Android系统的编译工具链采用的是“gcc/g++”,而NDK采用的是“clang/clang++”,所以才出现编译报错。
不知道你们是否有针对这种应用场景有相对的编译方案,谢谢。
Hi nihui. 这个libncnn.a编译报错的问题我自己找办法解决了。我这里把解决思路写一下,希望对后面需要的伙伴们有所帮助。大概操作流程如下:
开始编译,注意必须添加这个宏定义-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
Done! Enjoy ncnn!
cheers !
Most helpful comment
Hi nihui. 这个libncnn.a编译报错的问题我自己找办法解决了。我这里把解决思路写一下,希望对后面需要的伙伴们有所帮助。大概操作流程如下:
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()
开始编译,注意必须添加这个宏定义-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
Done! Enjoy ncnn!