如何使用 CMake 在 android 构建上编译和共享两个 c++ 库

How to compile and share two c++ libraries on an android build using CMake

本文关键字:两个 c++ 共享 CMake 何使用 android 构建 编译      更新时间:2023-10-16

我有自定义的C++类,我想在我的安卓应用程序上运行。我使用CMakeLists成功绑定了我的C++文件。但是当我的类使用 opencv 时,我遇到了一个明显的问题

fatal error: 'opencv2/core.hpp' file not found

然后我尝试在我的安卓应用程序上添加opencv库,下载了打开的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:UsersBrainants with arguments {TechnologyAppDataLocalAndroidSdkcmake3.10.2.4988404binninja.exe -C E:SqutagSqutag Mobileandroidapp.cxxcmakedebugarmeabi-v7a opencv2 squtag_native}
ninja: Entering directory `E:SqutagSqutag Mobileandroidapp.cxxcmakedebugarmeabi-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:UsersBRAINA~1AppDataLocalAndroidSdkndk210~1.611TOOLCH~1llvmprebuiltWINDOW~1binCLANG_~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 CMakeFilessqutag_native.dirE_SqutagSqutag_MobileiosRunnerSqutag_Nativesqutag_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 添加到本机 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

看起来您的 cmake 项目找不到已安装的 opencv,因此要么将路径设置为${complete_path_to_opencv_installation}/apt,要么将 opencv 安装在通用安装文件夹中

无论哪种方式,您都需要将其传播到您的项目中: 如果您将其安装在典型位置(例如/usr/local/Linux 中,您需要在 Windows 中设置export PATH=$PATH:${opencv_installation_path}c:Path,然后在环境变量中设置路径

通过这样做,find_package(OpenCV)应该能够找到 opencv 库并设置OpenCV_INCLUDE_DIRS。 此CMakeLists.txt应该可以工作:

cmake_minimum_required(VERSION 3)
project( DisplayImage )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )

或者您也可以在include_directories之前set OpenCV_INCLUDE_DIRS "./app/opencv2"传播opencv2/core.hpp.

你也可以对这篇关于在Android上使用opencv的旧文章感兴趣。