【问题标题】:Building OpenCV 4.0 for Android: Cannot Include <iostream>?为 Android 构建 OpenCV 4.0:不能包含 <iostream>?
【发布时间】:2019-12-05 21:45:29
【问题描述】:

我正在尝试从 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在哪里:在d:\OpenCVBuild\android-ndk-r16b-linux-x86_64\sources\cxx-stl\llvm-libc++\include\位置,有很多文件,包括iostream(但是没有任何扩展名,不是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]
 }

【问题讨论】:

  • 我没有 Android 开发经验,但我会问一些显而易见的问题。您的系统上是否有 iostream?如果是这样,它在哪里?你用的是什么编译器?
  • 我不知道(我说过我不知道 Android)。但是有两种可能性,要么你的计算机中缺少 iostream 头文件,要么它存在但编译器在错误的位置寻找它。知道其中哪一个是正确的,是解决问题的第一步。如果第一个是真的,那么你必须以某种方式安装丢失的头文件,如果第二个是真的,那么你必须了解你的编译器如何找到头文件并修复导致它在错误位置查找的任何问题。
  • 这可能看起来很复杂,但是如果您要进行开发,您必须了解您正在使用的工具(尤其是当出现问题时)。我想你需要阅读一些在 Android 上开发的背景资料。这些不是简单的系统,您必须了解它们。

标签: android c++ opencv cmake android-ndk


【解决方案1】:

include &lt;iostream&gt; 仅在 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 重新运行代码以获得正确的错误(消息不会在编译线程之间交错)。

【讨论】:

  • 啊!好点子!它实际上是 OpenCV 源代码,我没有修改...让我看看。谢谢!!
  • 但是,它是一个 .cxx 文件,而不是一个 .c 文件……那我该怎么办?非常感谢!
  • make -j1 输出开始,你会看到问题
  • 好的,让我试试吧!
  • 我通过发现OpenCV toolchain.cmake生成的include dirs错误来解决它......我手动修改它,它现在可以包含。但是,它现在还有另一个问题......请参阅修改后的问题
猜你喜欢
  • 1970-01-01
  • 2013-06-16
  • 2011-12-22
  • 1970-01-01
  • 2012-04-20
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多