且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-09-15 23:27:45

文章目录

一、报错信息

二、报错信息





一、报错信息


使用 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 ”已退出,代码为 2。
1>已完成生成项目“magic.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

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





二、报错信息


仔细研究报错信息 , 发现 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 架构 , 对应的实现也不同 ;