首页 > 解决方案 > 为 Android 构建 OpenCV 4.0:不能包含?

问题描述

我正在尝试从Android库的源代码构建 OpenCV。但是,会出现以下错误:

[ 18%] Building C object 3rdparty/libtiff/CMakeFiles/libtiff.dir/tif_unix.c.o
/mnt/d/OpenCVBuild/src/3rdparty/libtiff/tif_stream.cxx:29:20: fatal error: iostream: No such file or directory
 #include <iostream>

(顺便说一句,每当它试图包含 iostream 时,似乎都会发生这种错误,我只是粘贴一个典型的错误,因为每个人都是一样的。)

我的构建命令:

/mnt/d/OpenCVBuild/cmake-3.15.1-Linux-x86_64/bin/cmake \
-DCMAKE_TOOLCHAIN_FILE=../src/platforms/android/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_STL=c++_shared \
-DCMAKE_ANDROID_STL_TYPE=c++_shared \
-DANDROID_NATIVE_API_LEVEL=27 \
-DANDROID_SDK=/mnt/d/OpenCVBuild/android-sdk \
-DANDROID_NDK=/mnt/d/OpenCVBuild/android-ndk-r16b-linux-x86_64 \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
-DBUILD_FAT_JAVA_LIB=OFF \
-DBUILD_PROTOBUF=OFF \
-DWITH_CUDA=OFF -DWITH_MATLAB=OFF -DBUILD_ANDROID_PROJECTS=OFF -DBUILD_ANDROID_EXAMPLES=OFF -DBUILD_DOCS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_TESTS=OFF \
../src \
&& make -j4

感谢您的任何建议!

编辑:编译-j1

[ 13%] Building CXX object 3rdparty/libtiff/CMakeFiles/libtiff.dir/tif_stream.cxx.o
/mnt/d/OpenCVBuild/src/3rdparty/libtiff/tif_stream.cxx:29:20: fatal error: iostream: No such file or directory
 #include <iostream>
                    ^
compilation terminated.
3rdparty/libtiff/CMakeFiles/libtiff.dir/build.make:582: recipe for target '3rdparty/libtiff/CMakeFiles/libtiff.dir/tif_stream.cxx.o' failed
make[2]: *** [3rdparty/libtiff/CMakeFiles/libtiff.dir/tif_stream.cxx.o] Error 1
CMakeFiles/Makefile2:293: recipe for target '3rdparty/libtiff/CMakeFiles/libtiff.dir/all' failed
make[1]: *** [3rdparty/libtiff/CMakeFiles/libtiff.dir/all] Error 2
Makefile:162: recipe for target 'all' failed
make: *** [all] Error 2

关于 iostream 在哪里:在 locationd:\OpenCVBuild\android-ndk-r16b-linux-x86_64\sources\cxx-stl\llvm-libc++\include\中,有很多文件,包括iostream(但是没有任何扩展名,not iostream.h)。

顺便说一下,这是cmake的一些信息:

--   CPU/HW features:
--     Baseline:                    NEON
--       requested:                 NEON FP16
--
--   C/C++:
--     Built as dynamic libs?:      YES
--     C++ Compiler:                /mnt/d/OpenCVBuild/android-ndk-r16b-linux-x86_64/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-g++  (ver 4.9.0)
--     C++ flags (Release):         -fexceptions -frtti -Wno-psabi --sysroot=/mnt/d/OpenCVBuild/android-ndk-r16b-linux-x86_64/platforms/android-27/arch-arm64 -funwind-tables -fsigned-char -no-canonical-prefixes -fdata-sections -ffunction-sections -Wa,--noexecstack  -DANDROID -D__ANDROID_API__=27   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wsign-promo -Wuninitialized -Winit-self -Wno-delete-non-virtual-dtor -Wno-comment -Wno-missing-field-initializers -fdiagnostics-show-option -fomit-frame-pointer -ffunction-sections -fdata-sections   -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -O3 -DNDEBUG  -DNDEBUG
--     C++ flags (Debug):           -fexceptions -frtti -Wno-psabi --sysroot=/mnt/d/OpenCVBuild/android-ndk-r16b-linux-x86_64/platforms/android-27/arch-arm64 -funwind-tables -fsigned-char -no-canonical-prefixes -fdata-sections -ffunction-sections -Wa,--noexecstack  -DANDROID -D__ANDROID_API__=27   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wundef -Winit-self -Wpointer-arith -Wsign-promo -Wuninitialized -Winit-self -Wno-delete-non-virtual-dtor -Wno-comment -Wno-missing-field-initializers -fdiagnostics-show-option -fomit-frame-pointer -ffunction-sections -fdata-sections   -fvisibility=hidden -fvisibility-inlines-hidden -fno-omit-frame-pointer -fno-strict-aliasing -O0 -g -DDEBUG -D_DEBUG  -DDEBUG -D_DEBUG
--     C Compiler:                  /mnt/d/OpenCVBuild/android-ndk-r16b-linux-x86_64/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc
--     C flags (Release):           -fexceptions -Wno-psabi --sysroot=/mnt/d/OpenCVBuild/android-ndk-r16b-linux-x86_64/platforms/android-27/arch-arm64 -funwind-tables -fsigned-char -no-canonical-prefixes -fdata-sections -ffunction-sections -Wa,--noexecstack  -DANDROID -D__ANDROID_API__=27   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wuninitialized -Winit-self -Wno-comment -Wno-missing-field-initializers -fdiagnostics-show-option -fomit-frame-pointer -ffunction-sections -fdata-sections   -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300 -O3 -DNDEBUG  -DNDEBUG
--     C flags (Debug):             -fexceptions -Wno-psabi --sysroot=/mnt/d/OpenCVBuild/android-ndk-r16b-linux-x86_64/platforms/android-27/arch-arm64 -funwind-tables -fsigned-char -no-canonical-prefixes -fdata-sections -ffunction-sections -Wa,--noexecstack  -DANDROID -D__ANDROID_API__=27   -fsigned-char -W -Wall -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Wformat -Werror=format-security -Wmissing-declarations -Wmissing-prototypes -Wstrict-prototypes -Wundef -Winit-self -Wpointer-arith -Wuninitialized -Winit-self -Wno-comment -Wno-missing-field-initializers -fdiagnostics-show-option -fomit-frame-pointer -ffunction-sections -fdata-sections   -fvisibility=hidden -fno-omit-frame-pointer -fno-strict-aliasing -O0 -g -DDEBUG -D_DEBUG  -DDEBUG -D_DEBUG
--     Linker flags (Release):      -Wl,--no-undefined -Wl,-allow-shlib-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now   -Wl,--gc-sections
--     Linker flags (Debug):        -Wl,--no-undefined -Wl,-allow-shlib-undefined -Wl,--gc-sections -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now   -Wl,--gc-sections
--     ccache:                      NO
--     Precompiled headers:         NO
--     Extra dependencies:          dl m log

EDIT2:我尝试使用gnustl,即

-DANDROID_STL=gnustl_static \
-DCMAKE_ANDROID_STL_TYPE=gnustl_static \

但有错误:

[ 69%] Building CXX object modules/core/CMakeFiles/opencv_core.dir/src/utils/logtagmanager.cpp.o
/mnt/d/OpenCVBuild/src/modules/core/src/utils/logtagconfigparser.cpp: In static member function 'static std::string cv::utils::logging::LogTagConfigParser::toString(cv::utils::logging::LogLevel)':
/mnt/d/OpenCVBuild/src/modules/core/src/utils/logtagconfigparser.cpp:301:16: error: 'to_string' is not a member of 'std'
         return std::to_string((int)level);
                ^
/mnt/d/OpenCVBuild/src/modules/core/src/utils/logtagconfigparser.cpp:303:1: error: control reaches end of non-void function [-Werror=return-type]
 }

标签: androidc++opencvcmakeandroid-ndk

解决方案


include <iostream>仅在 C++ 语言中可用,而不是 C。这些是不同的语言(即使它们非常相似)。

您的代码被保存到 C 文件中

[ 18%] Building C object 3rdparty/libtiff/CMakeFiles/libtiff.dir/tif_unix.c.o
/mnt/d/OpenCVBuild/src/3rdparty/libtiff/tif_stream.cxx:29:20: fatal error: 
iostream: No such file or directory
#include <iostream>

您是否将 C++ 文件包含到 C 文件中?请重新运行代码make -j1以获得正确的错误(消息不会在编译线程之间交错)。


推荐阅读