c++ - 如何使用 CMake 在 android 构建上编译和共享两个 c++ 库
问题描述
我有想要在我的 android 应用程序上运行的自定义 C++ 类。我成功地使用 . 绑定了我的 C++ 文件CMakeLists
。但是当我的课程使用opencv时,我遇到了一个很明显的问题
fatal error: 'opencv2/core.hpp' file not found
然后我尝试在我的 android 应用程序上添加 opencv 库,下载了 open cv android sdk 并厌倦了将它添加到我的项目中。下面是文件夹结构
android
-> app
-> opencv2
All the opencv2 c++ files and folders
->folder1
My custom c++ classes which will import opencv2.
以下是我的 CMakeLists.txt 文件
cmake_minimum_required(VERSION 3.4.1) # for example
set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
PROJECT(tag)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
add_library( tag_native
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
"./folder1/tag_native.cpp" )
add_library( opencv2
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
"./opencv2/" )
set_target_properties(opencv2 PROPERTIES LINKER_LANGUAGE CXX)
这是我的 cpp 文件的示例
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <iostream>
#include <opencv2/core.hpp>
c++ 中的所有内容都编译得很好,但我仍然遇到同样的问题
* What went wrong:
Execution failed for task ':app:externalNativeBuildDebug'.
> Build command failed.
Error while executing process C:\Users\Brainants with arguments {Technology\AppData\Local\Android\Sdk\cmake\3.10.2.4988404\bin\ninja.exe -C E:\Squtag\Squtag Mobile\android\app\.cxx\cmake\debug\armeabi-v7a opencv2 squtag_native}
ninja: Entering directory `E:\Squtag\Squtag Mobile\android\app\.cxx\cmake\debug\armeabi-v7a'
[1/2] Building CXX object CMakeFiles/squtag_native.dir/E_/Squtag/Squtag_Mobile/ios/Runner/Squtag_Native/squtag_native.cpp.o
FAILED: CMakeFiles/squtag_native.dir/E_/Squtag/Squtag_Mobile/ios/Runner/Squtag_Native/squtag_native.cpp.o
C:\Users\BRAINA~1\AppData\Local\Android\Sdk\ndk\210~1.611\TOOLCH~1\llvm\prebuilt\WINDOW~1\bin\CLANG_~1.EXE --target=armv7-none-linux-androideabi24 --gcc-toolchain="C:/Users/Brainants Technology/AppData/Local/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/windows-x86_64" --sysroot="C:/Users/Brainants Technology/AppData/Local/Android/Sdk/ndk/21.0.6113669/toolchains/llvm/prebuilt/windows-x86_64/sysroot" -Dsqutag_native_EXPORTS -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -march=armv7-a -Wformat -Werror=format-security -fsanitize=address -fno-omit-frame-pointer -std=c++11 -O0 -fno-limit-debug-info -fPIC -MD -MT CMakeFiles/squtag_native.dir/E_/Squtag/Squtag_Mobile/ios/Runner/Squtag_Native/squtag_native.cpp.o -MF CMakeFiles\squtag_native.dir\E_\Squtag\Squtag_Mobile\ios\Runner\Squtag_Native\squtag_native.cpp.o.d -o CMakeFiles/squtag_native.dir/E_/Squtag/Squtag_Mobile/ios/Runner/Squtag_Native/squtag_native.cpp.o -c "E:/Squtag/Squtag Mobile/ios/Runner/Squtag Native/squtag_native.cpp"
E:/Squtag/Squtag Mobile/ios/Runner/Squtag Native/squtag_native.cpp:6:10: fatal error: 'opencv2/core.hpp' file not found
#include <opencv2/core.hpp>
^~~~~~~~~~~~~~~~~~
1 error generated.
ninja: build stopped: subcommand failed.
解决方案
你得到的错误是告诉你它找不到opencv包含文件:
#include <opencv2/core.hpp>
您需要找到 opencv2 文件夹,并将其作为附加包含目录传递给 cmake:
https://cmake.org/cmake/help/v3.0/command/include_directories.html
示例:在 Android Studio 上通过 CMake 将 OpenCV 添加到 Native C 代码中
cmake_minimum_required(VERSION 3.4.1)
set(OpenCV_DIR "src/sdk/native/jni")
find_package(OpenCV REQUIRED)
message(STATUS "OpenCV libraries: ${OpenCV_LIBS}")
include_directories(${OpenCV_INCLUDE_DIRS})
或者您可以使用这种方法: https ://github.com/ahasbini/Android-OpenCV/blob/master/app/CMakeLists.txt
推荐阅读
- mysql - 即使在 IN 子句中找不到也返回数据 - mysql
- javascript - 如何在 onclick 中响应特定值
- python-3.8 - 无法在 python3 中安装 face_recognition
- c# - 单击 Android 版 Google 地图中的标记单击会使方向/地图按钮消失
- shell - 在 Linux 的脚本中合并两个 ImageMagick 代码
- c++ - `delete[]` 不是 `new[]` 的对应项吗?
- c++ - 无法在 Debian Linux 中编译 C++17
- c# - “HttpContextAccessor”不包含“Session”的定义
- click - openlayers:鼠标悬停并单击标记自 6.2.0 起不起作用
- xamarin.forms - Xamarin.Forms 图像在 iOS 中不重叠的框架内有负边距