使用OpenCV 2.4.11编译报错:找不到'ext/atomicity.h'文件,求助CMake配置
解决Android CMake构建OpenCV 2.4.11时'ext/atomicity.h'找不到的问题
这个问题的核心是OpenCV 2.4.11依赖旧版的GNU STL(gnustl),而Android Studio 3+默认使用的是LLVM的libc++,后者没有ext/atomicity.h这个头文件。结合你的配置,我给你一套可行的修复方案:
步骤1:匹配兼容的NDK版本
OpenCV 2.4.11是比较老旧的版本,它的编译依赖的gnustl在NDK r18及以后的版本中被移除了。所以你需要:
- 下载NDK r17或者更早的版本(比如r17c)
- 在项目根目录的
local.properties文件中指定NDK路径:
ndk.dir=/path/to/your/android-ndk-r17c
步骤2:修改CMakeLists.txt配置STL并链接OpenCV库
你的CMake配置有两个关键问题:没有指定正确的STL,也没有将OpenCV库链接到你的native-lib。修改后的CMakeLists.txt如下:
cmake_minimum_required(VERSION 3.4.1) # 指定使用gnustl_shared,匹配OpenCV 2.4.11的依赖 set(ANDROID_STL "gnustl_shared") set(CMAKE_INCLUDE_CURRENT_DIR ON) # OpenCV IMPORT include_directories(C:/OpenCV-android-sdk_2_4_11/sdk/native/jni/include) add_library( lib-opencv SHARED IMPORTED ) set_target_properties(lib-opencv PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libopencv_java.so) add_library( native-lib SHARED native-lib.cpp main.cpp ) find_library( log-lib log ) # 把OpenCV库链接到你的native-lib,这一步你之前漏掉了! target_link_libraries( native-lib lib-opencv ${log-lib} )
步骤3:优化build.gradle配置
确保你的externalNativeBuild配置和CMake保持一致,同时可以明确指定NDK版本(可选,但更稳妥):
apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "27.0.3" // 指定NDK版本,和你下载的r17c对应 ndkVersion "17.2.4988734" defaultConfig { applicationId "com.test" minSdkVersion 21 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { cppFlags "-frtti -fexceptions" abiFilters "armeabi-v7a" // 这里也可以指定STL,和CMake保持一致 arguments "-DANDROID_STL=gnustl_shared" } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } } sourceSets { main { jni.srcDirs = ['src/main/cpp', 'src/main/jniLib/'] } } } dependencies { implementation project(':openCVLibrary2411') }
为什么这样修复?
ext/atomicity.h是gnustl特有的头文件,libc++(NDK默认)没有这个文件,所以必须指定使用gnustl- 你之前的CMake没有把导入的OpenCV库链接到你的native-lib,这会导致编译时找不到OpenCV的符号,加上
lib-opencv后才能正常调用OpenCV的API - 旧版本OpenCV需要搭配旧版NDK,否则会因为STL不兼容出现各种编译错误
内容的提问来源于stack exchange,提问作者Pablo Fiorenza
相关产品推荐
相关产品推荐

