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

Posted 韩曙亮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误记录Visual Studio 中编译 NDK 报错 ( no matching function for call to ‘cacheflush‘ cacheflush(); )相关的知识,希望对你有一定的参考价值。





一、报错信息



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

报错信息 :

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 ”已退出,代码为 21>已完成生成项目“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 函数为 :

extern int cacheflush(long start, long end, long flags);

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

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

#ifndef __i386__
				cacheflush();

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

APP_ABI					:= x86 
#armeabi-v7a  armeabi
APP_STL					:= gnustl_static
APP_PLATFORM			:= android-19

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

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

以上是关于错误记录Visual Studio 中编译 NDK 报错 ( no matching function for call to ‘cacheflush‘ cacheflush(); )的主要内容,如果未能解决你的问题,请参考以下文章

错误记录Visual Studio 中配置 NDK 头文件路径

错误记录Visual Studio 中配置 NDK 头文件路径 ( NDK 的三个头文件路径 | 与 CPU 架构相关 asm 头文件路径选择 )

错误记录Android Studio 编译报错 ( VirtualApp 编译 NDK 报错 | Error:A problem occurred configuring project ‘: )(代

错误记录Android Studio 编译报错 ( VirtualApp 编译 NDK 报错 | Error:A problem occurred configuring project ‘: )(代

Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | 使用 Makefile 构建 Android 平台 NDK 应用 )(代码

Android 逆向Android 进程注入工具开发 ( Visual Studio 开发 Android NDK 应用 | Visual Studio 中 SDK 和 NDK 安装位置 )(代码片段