c++ - 为 Raspberry PI 交叉编译 WebRTC+OpenCV

标签 c++ opencv raspberry-pi arm webrtc

我可以为 arm 交叉编译 webrtc 并运行 peerconnection 示例。现在我想在 peerconnection 示例中使用 opencv。我将类添加到 BUILD.ng 并开始 ninja 构建,但出现以下错误。你能帮我构建WebRTC+OpenCV吗?我也交叉编译了 OpenCV。

ninja -C out/Default
ninja: Entering directory `out/Default'
[1/4] CXX obj/webrtc/examples/peerconnection_client/CustomVideoCapturer.o
FAILED: obj/webrtc/examples/peerconnection_client/CustomVideoCapturer.o 
../../third_party/llvm-build/Release+Asserts/bin/clang++ -MMD -MF obj/webrtc/examples/peerconnection_client/CustomVideoCapturer.o.d -DV8_DEPRECATION_WARNINGS -DUSE_UDEV -DUI_COMPOSITOR_IMAGE_TRANSPORT -DUSE_AURA=1 -DUSE_PANGO=1 -DUSE_CAIRO=1 -DUSE_GLIB=1 -DUSE_NSS_CERTS=1 -DUSE_X11=1 -DFULL_SAFE_BROWSING -DSAFE_BROWSING_CSD -DSAFE_BROWSING_DB_LOCAL -DCHROMIUM_BUILD -DENABLE_MEDIA_ROUTER=1 -DFIELDTRIAL_TESTING_ENABLED -DCR_CLANG_REVISION=\"289944-2\" -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -DCOMPONENT_BUILD -D_DEBUG -DDYNAMIC_ANNOTATIONS_ENABLED=1 -DWTF_USE_DYNAMIC_ANNOTATIONS=1 -DWEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE -DEXPAT_RELATIVE_PATH -DHAVE_SCTP -DWEBRTC_ARCH_ARM -DWEBRTC_ARCH_ARM_V7 -DWEBRTC_HAS_NEON -DWEBRTC_POSIX -DWEBRTC_LINUX -DWEBRTC_BUILD_LIBEVENT -I/usr/local/include -I/usr/local/include/opencv -I../.. -Igen -I../../third_party/libyuv/include -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/gtk-2.0 -I../../build/linux/debian_wheezy_arm-sysroot/usr/lib/arm-linux-gnueabihf/gtk-2.0/include -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/gio-unix-2.0 -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/cairo -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/pango-1.0 -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/atk-1.0 -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/cairo -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/pixman-1 -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/libpng12 -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/gdk-pixbuf-2.0 -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/libpng12 -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/pango-1.0 -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/freetype2 -I../../build/linux/debian_wheezy_arm-sysroot/usr/include/glib-2.0 -I../../build/linux/debian_wheezy_arm-sysroot/usr/lib/arm-linux-gnueabihf/glib-2.0/include -I../../third_party/jsoncpp/overrides/include -I../../third_party/jsoncpp/source/include -Wstring-conversion -fno-strict-aliasing --param=ssp-buffer-size=4 -fstack-protector -Wno-builtin-macro-redefined -D__DATE__= -D__TIME__= -D__TIMESTAMP__= -funwind-tables -fPIC -pipe -fcolor-diagnostics --target=arm-linux-gnueabihf -march=armv7-a -mfloat-abi=hard -mtune=generic-armv7-a -pthread -mfpu=neon -mthumb -Wall -Werror -Wextra -Wno-missing-field-initializers -Wno-unused-parameter -Wno-c++11-narrowing -Wno-covered-switch-default -Wno-deprecated-register -Wno-unneeded-internal-declaration -Wno-inconsistent-missing-override -Wno-shift-negative-value -Wno-undefined-var-template -Wno-nonportable-include-path -Wno-address-of-packed-member -Wno-block-capture-autoreleasing -O0 -fno-omit-frame-pointer -g2 --sysroot=../../build/linux/debian_wheezy_arm-sysroot -fvisibility=hidden -Wheader-hygiene -Wstring-conversion -Wtautological-overlap-compare -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -Wno-strict-overflow -Wimplicit-fallthrough -Wthread-safety -Winconsistent-missing-override -Wundef -Wno-inconsistent-missing-override -fvisibility-inlines-hidden -Wno-undefined-bool-conversion -Wno-tautological-undefined-compare -std=gnu++11 -fno-rtti -fno-exceptions -Wnon-virtual-dtor -Woverloaded-virtual -c ../../webrtc/examples/peerconnection/client/CustomVideoCapturer.cpp -o obj/webrtc/examples/peerconnection_client/CustomVideoCapturer.o
In file included from ../../webrtc/examples/peerconnection/client/CustomVideoCapturer.cpp:6:
In file included from /usr/local/include/opencv2/opencv.hpp:56:
In file included from /usr/local/include/opencv2/calib3d.hpp:49:
/usr/local/include/opencv2/core/affine.hpp:287:20: error: implicit conversion turns string literal into bool: 'const char [35]' to 'bool' [-Werror,-Wstring-conversion]
        CV_Assert(!"Input marix can be 3x3, 1x3 or 3x1");
                  ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/opencv2/core/base.hpp:412:33: note: expanded from macro 'CV_Assert'
#define CV_Assert( expr ) if(!!(expr)) ; else cv::error( cv::Error::StsAssert, #expr, CV_Func, __FILE__, __LINE__ )
                                ^~~~
In file included from ../../webrtc/examples/peerconnection/client/CustomVideoCapturer.cpp:6:
In file included from /usr/local/include/opencv2/opencv.hpp:62:
In file included from /usr/local/include/opencv2/flann.hpp:48:
In file included from /usr/local/include/opencv2/flann/flann_base.hpp:40:
In file included from /usr/local/include/opencv2/flann/params.h:33:
/usr/local/include/opencv2/flann/any.h:58:51: error: cannot use typeid with -fno-rtti
    virtual const std::type_info& type() { return typeid(T); }
                                                  ^
/usr/local/include/opencv2/flann/any.h:268:31: error: cannot use typeid with -fno-rtti
        if (policy->type() != typeid(T)) throw anyimpl::bad_any_cast();
                              ^
/usr/local/include/opencv2/flann/any.h:268:42: error: cannot use 'throw' with exceptions disabled
        if (policy->type() != typeid(T)) throw anyimpl::bad_any_cast();
                                         ^
/usr/local/include/opencv2/flann/any.h:277:31: error: cannot use typeid with -fno-rtti
        if (policy->type() != typeid(T)) throw anyimpl::bad_any_cast();
                              ^
/usr/local/include/opencv2/flann/any.h:277:42: error: cannot use 'throw' with exceptions disabled
        if (policy->type() != typeid(T)) throw anyimpl::bad_any_cast();
                                         ^
/usr/local/include/opencv2/flann/any.h:285:34: error: cannot use typeid with -fno-rtti
        return policy->type() == typeid(anyimpl::empty_any);
                                 ^
/usr/local/include/opencv2/flann/any.h:305:34: error: cannot use typeid with -fno-rtti
        return policy->type() == typeid(T);
                                 ^
In file included from ../../webrtc/examples/peerconnection/client/CustomVideoCapturer.cpp:6:
In file included from /usr/local/include/opencv2/opencv.hpp:62:
In file included from /usr/local/include/opencv2/flann.hpp:48:
In file included from /usr/local/include/opencv2/flann/flann_base.hpp:40:
/usr/local/include/opencv2/flann/params.h:78:9: error: cannot use 'throw' with exceptions disabled
        throw FLANNException(cv::String("Missing parameter '")+name+cv::String("' in the parameters given"));
        ^
In file included from ../../webrtc/examples/peerconnection/client/CustomVideoCapturer.cpp:6:
In file included from /usr/local/include/opencv2/opencv.hpp:62:
In file included from /usr/local/include/opencv2/flann.hpp:48:
In file included from /usr/local/include/opencv2/flann/flann_base.hpp:41:
/usr/local/include/opencv2/flann/saving.h:113:9: error: cannot use 'throw' with exceptions disabled
        throw FLANNException("Invalid index file, cannot read");
        ^
/usr/local/include/opencv2/flann/saving.h:117:9: error: cannot use 'throw' with exceptions disabled
        throw FLANNException("Invalid index file, wrong signature");
        ^
/usr/local/include/opencv2/flann/saving.h:151:9: error: cannot use 'throw' with exceptions disabled
        throw FLANNException("Cannot read from file");
        ^
/usr/local/include/opencv2/flann/saving.h:160:9: error: cannot use 'throw' with exceptions disabled
        throw FLANNException("Cannot read from file");
        ^
/usr/local/include/opencv2/flann/saving.h:165:9: error: cannot use 'throw' with exceptions disabled
        throw FLANNException("Cannot read from file");
        ^
/usr/local/include/opencv2/flann/saving.h:176:9: error: cannot use 'throw' with exceptions disabled
        throw FLANNException("Cannot read from file");
        ^
/usr/local/include/opencv2/flann/saving.h:181:9: error: cannot use 'throw' with exceptions disabled
        throw FLANNException("Cannot read from file");
        ^
In file included from ../../webrtc/examples/peerconnection/client/CustomVideoCapturer.cpp:6:
In file included from /usr/local/include/opencv2/opencv.hpp:62:
In file included from /usr/local/include/opencv2/flann.hpp:48:
In file included from /usr/local/include/opencv2/flann/flann_base.hpp:43:
In file included from /usr/local/include/opencv2/flann/all_indices.h:38:
/usr/local/include/opencv2/flann/kmeans_index.h:372:13: error: cannot use 'throw' with exceptions disabled
            throw FLANNException("Unknown algorithm for choosing initial centers.");
            ^
/usr/local/include/opencv2/flann/kmeans_index.h:435:13: error: cannot use 'throw' with exceptions disabled
            throw FLANNException("Branching factor must be at least 2");
            ^
/usr/local/include/opencv2/flann/kmeans_index.h:536:13: error: cannot use 'throw' with exceptions disabled
            throw FLANNException("Number of clusters must be at least 1");
            ^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
ninja: build stopped: subcommand failed.

最佳答案

此问题是由于 WebRTC 默认编译标志阻止编译 opencv。

要解决这些问题,请按照以下步骤操作

  • 在您的 Build.GN 中,添加以下参数

    suppressed_configs += [ "//build/config/clang:extra_warnings" ]

    上面的配置让string-bool转换错误变成警告

    suppressed_configs += [ "//build/config/compiler:no_rtti" ]

    上面的配置使“cannot use typeid with -fno-rtti”消失

  • 使“无法使用‘throw’并禁用异常”错误消失

    转到//WebRTC/build/config/BUILDCONFIG.GN 文件

    像下面一样注释掉下面的行“//build/config/gcc:no_exceptions”

    default_compiler_configs += [

    # "//build/config/gcc:no_exceptions",

    "//build/config/gcc:symbol_visibility_hidden",

    ]

关于c++ - 为 Raspberry PI 交叉编译 WebRTC+OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42795726/

相关文章:

c++ - 从 Ubuntu 运行一个可执行文件到 Debian

c++ - 在实时视频上检测 SURF 点

c++ - 在 OpenCV 中计算 ROI 内的对象区域

opencv - 使用重映射函数 opencv 2.3.1

ffmpeg - 使用ffmpeg录制时从视频中提取帧

c++ - 具有直接像素访问的 Opencv 颜色映射

c++ - Eclipse CDT 无法调试以进入同一目录中的函数定义

c++ - libusb:在Linux上的C++中,错误[op_open] getcap失败

c - 树莓派RS232问题

c++ - 从 cv::connectedComponents 访问标记区域