首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【错误记录】Visual Studio 中编译 NDK 报错 ( no matching function for call to ‘cacheflush‘ cacheflush(); )

【错误记录】Visual Studio 中编译 NDK 报错 ( no matching function for call to ‘cacheflush‘ cacheflush(); )

作者头像
韩曙亮
发布2023-03-29 20:41:30
发布2023-03-29 20:41:30
1.1K0
举报

文章目录

一、报错信息


使用 Visual Studio 2019 编译 Android 平台的 NDK 项目 ; 编译时报错 ;

报错信息 :

代码语言:javascript
复制
1>./native/native.cpp(428,14): warning G0C39A92D: 'SearchCode' has C-linkage specified, but returns user-defined type 'std::string' (aka 'basic_string<char>') which is incompatible with C [-Wreturn-type-c-linkage]
1>        std::string SearchCode(unsigned char* data,unsigned size){
1>                    ^
1>./native/native.cpp(658,5): error GEF7559A7: no matching function for call to 'cacheflush'
1>                                cacheflush();
1>                                ^~~~~~~~~~
1>D:/001_Develop/001_SDK/Sdk/ndk/android-ndk-r14b/build//../platforms/android-19/arch-arm/usr/include\unistd.h:183:12: note: candidate function not viable: requires 3 arguments, but 0 were provided
1>extern int cacheflush(long start, long end, long flags);
1>           ^
1>1 warning and 1 error generated.
1>make: *** [obj/local/armeabi-v7a/objs/native/native/native.o] Error 1
1>D:\001_Develop\017_Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.MakeFile.Targets(46,5): error MSB3073: 命令“"D:\001_Develop\001_SDK\Sdk\ndk\android-ndk-r14b\build\ndk-build.cmd" NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk NDK_APPLICATION_MK=Application.mk ”已退出,代码为 2。
1>已完成生成项目“magic.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

二、报错信息


仔细研究报错信息 , 发现 D:/001_Develop/001_SDK/Sdk/ndk/android-ndk-r14b/build//../platforms/android-19/arch-arm/usr/include\unistd.h:183:12: note: candidate function not viable: requires 3 arguments, but 0 were provided , 调用的函数头文件是 android-19/arch-arm/usr/include\unistd.h , 这是 ARM 平台的头文件 , 其中的函数定义的都是 ARM 架构的函数 ;

在 ARM 架构的 android-19/arch-arm/usr/include/unistd.h 头文件中 , cacheflush 函数为 :

代码语言:javascript
复制
extern int cacheflush(long start, long end, long flags);

在 x86 架构中该系统调用无效 ;

如果编译的目标 函数库 或 可执行文件 架构有 x86 架构 , 就会报错 , 因为该函数只支持 ARM 架构 ;

代码语言:javascript
复制
#ifndef __i386__
				cacheflush();

在 Application.mk 中 , 要声明只为 x86 编译函数库 , 注释掉 armeabi-v7a armeabi 这两个目标架构 ;

代码语言:javascript
复制
APP_ABI					:= x86 
#armeabi-v7a  armeabi
APP_STL					:= gnustl_static
APP_PLATFORM			:= android-19

涉及 CPU 操作时 , 注意编译的架构 , 以及引用的依赖库 ;

cacheflush 函数是系统调用中刷新 CPU 高速缓存的函数 , 不同的 CPU 架构 , 对应的实现也不同 ;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 一、报错信息
  • 二、报错信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档