目录

    在使用gcc-linaro-7.5.0-aarch64-linux-gnu、gcc-linaro-6.3.1-aarch64-linux-gnu交叉编译链对MNN1.2.0进行交叉编译的过程中,make的时候遇到了一个报错。

    error: cannot convert 'int8x16_t {aka __vector(16) signed char}' to 'int32x4_t {aka__vector(4) int}' for argument '1' to 'int32x4_t vtrnlq_s32(int32x4_t, int32x4_t)'

    ![]( https://img-blog.csdnimg.cn/20210813133912185.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTQ0MzEx,size_16,color_FFFFFF,t_70)

    发生错误的源代码在./source/backend/cpu/compute/WinogradInt8Helper.cpp的第39~44行。

    ![]( https://img-blog.csdnimg.cn/202108131342014.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTQ0MzEx,size_16,color_FFFFFF,t_70)

    大概原因是在定义m0m3的时候,传入vtrn1q_s32()函数的vec0.valuevec3.value是int8x16_t型的,而vtrn1q_s32()函数需要传入int32x4_t型的参数,所以发生了类型冲突。

    这里有人反映了相同与类似的错误,有人回答说在mater版本的MNN中已经修复,但我使用mater版本的MNN进行交叉编译仍然会出现相同的错误。

    后来在这里发现了一模一样的错误与另一种解决方案,即使用reinterpret_cast()函数进行强制转换。

    ![]( https://img-blog.csdnimg.cn/20210813135018417.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTQ0MzEx,size_16,color_FFFFFF,t_70)

    具体的修改代码在我在图中用红框标出来的这个链接里。

    修改后的代码如下。

    ![]( https://img-blog.csdnimg.cn/20210813135142792.png?x-oss-process=image/watermark ,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTQ0MzEx,size_16,color_FFFFFF,t_70)

    随后重新进行交叉编译,编译成功。

    posted on 2023-01-30 13:29  KAWAKO  阅读(234)  评论(0)    收藏  举报