首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android项目中使用webrtc-58 -在使用QT构建时使用“对CopyOnWriteBuffer的未定义引用”

在Android项目中使用webrtc-58 -在使用QT构建时使用“对CopyOnWriteBuffer的未定义引用”
EN

Stack Overflow用户
提问于 2017-11-13 12:11:40
回答 2查看 666关注 0票数 1

我试图为Android构建一个共享库,它引用了webrtc-58为Android构建的libjingle_peerconnection.so,但是链接器出现了错误:

代码语言:javascript
复制
MyProject\Libs\webrtc-58\include\webrtc\api\datachannelinterface.h:64: error: undefined reference to 'rtc::CopyOnWriteBuffer::~CopyOnWriteBuffer()'
MyProject\Libs\webrtc-58\include\webrtc\base\copyonwritebuffer.h:48: error: undefined reference to 'rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int, unsigned int)'

与我在Ubuntu和Windows上构建项目的输出相同。在Ubuntu上构建时,我将QT配置为使用webrtc构建工具中的Android /NDK(用于构建libjingle_peerconnection )。

QT 4.4.1在Qt5.9.2 webrtc-58上使用折叠配置构建在Ubuntu上

代码语言:javascript
复制
gn gen out/Debug/arm-v7 --args='target_os="android" is_component_build=false rtc_include_tests=false target_cpu="arm"'

我已经转储了未剥离的libjingle_peerconnection.so,并注意到其中包含CopyOnWriteBuffer类实现:

代码语言:javascript
复制
001b2bbd t void rtc::CopyOnWriteBuffer::AppendData<unsigned char, (void*)0>(unsigned char const*, unsigned int)
000ee055 t rtc::CopyOnWriteBuffer::EnsureCapacity(unsigned int)
000edf51 t rtc::CopyOnWriteBuffer::CloneDataIfReferenced(unsigned int)
000fafd9 t char* rtc::CopyOnWriteBuffer::data<char, (void*)0>()
000fae61 t unsigned char* rtc::CopyOnWriteBuffer::data<unsigned char, (void*)0>()
000eddcd t rtc::CopyOnWriteBuffer::Clear()
00092cd1 t void rtc::CopyOnWriteBuffer::SetData<char, (void*)0>(char const*, unsigned int)
00092cd1 t void rtc::CopyOnWriteBuffer::SetData<unsigned char, (void*)0>(unsigned char const*, unsigned int)
000edb4d t rtc::CopyOnWriteBuffer::SetSize(unsigned int)
000fad19 t rtc::CopyOnWriteBuffer::operator=(rtc::CopyOnWriteBuffer&&)
000ed6f1 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int)
000ed7d9 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int, unsigned int)
000ed6e1 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(rtc::CopyOnWriteBuffer&&)
0003462f t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(rtc::CopyOnWriteBuffer const&)
0002f1f7 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer()
000faa35 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer<char, (void*)0>(char const*, unsigned int)
000ed6f1 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int)
000ed7d9 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int, unsigned int)
000ed6e1 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(rtc::CopyOnWriteBuffer&&)
0003462f t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(rtc::CopyOnWriteBuffer const&)
0002f1f7 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer()
000faa35 t rtc::CopyOnWriteBuffer::CopyOnWriteBuffer<char, (void*)0>(char const*, unsigned int)
0003452d t rtc::CopyOnWriteBuffer::~CopyOnWriteBuffer()
0003452d t rtc::CopyOnWriteBuffer::~CopyOnWriteBuffer()

MYPROJECT_Core.Pro的内容

代码语言:javascript
复制
QT  += core xml
QT  -= gui

TARGET = MYPROJECT_Core
TEMPLATE = lib

DEFINES += MYPROJECT_CORE_LIBRARY

DEFINES += QT_DEPRECATED_WARNINGS
DEFINES += NOMINMAX
DEFINES += ENABLE_RTC_EVENT_LOG


QMAKE_CFLAGS_WARN_ON -= -Wall
QMAKE_CXXFLAGS_WARN_ON -= -Wall
CONFIG += warn_off

android {
    CONFIG += c++11
    QMAKE_CXXFLAGS += -std=c++11

    DEFINES += NDEBUG=1
    DEFINES += WEBRTC_POSIX
    DEFINES += WEBRTC_ANDROID

    LIBS += -L$$PWD/../Libs/webrtc-58/lib/android/armeabi-v7a/jni/armeabi-v7a -ljingle_peerconnection_so
    INCLUDEPATH += $$PWD/../Libs/webrtc-58/include
    DEPENDPATH += $$PWD/../Libs/webrtc-58/include
} 


SOURCES += \
    main.cpp \
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-16 22:27:27

我的同事今天解决了这个问题。他用webrtc构建输出中的另一个库替换了libjingle_peerconnection.so

代码语言:javascript
复制
obj/webrtc/api/libjingle_peerconnection_api.a
ob/webrtc/base/librtc_base_approved.a

另外,QT和webrtc构建系统存在兼容性问题,所以Android是用gnustl构建的,而webrtc是用libc++构建的,所以他从Android包中包含了libc++_shared.so。整个Pro文件将如下所示

代码语言:javascript
复制
QT       -= gui

TARGET = WebRtcDependantLib
TEMPLATE = lib

#CONFIG += c++11
QMAKE_CXXFLAGS += -fno-rtti -fno-exceptions
DEFINES += MY_TEST_LIBRARY

android {
    DEFINES += WEBRTC_POSIX
    DEFINES += WEBRTC_ANDROID


    DEFINES += NDEBUG

    WEBRTC = /home/user/Dev/src  #WEBRTC-M58 sources directory
    WEBRTCBUILD = $$WEBRTC/out/Debug/arm-v7/obj
    #android NDK bundled by webrtc build system
    WEBRTCNDK = $$WEBRTC/third_party/android_tools/ndk

    LIBS += -Wl,--start-group
    LIBS += $$WEBRTCBUILD/webrtc/api/libjingle_peerconnection_api.a
    LIBS += $$WEBRTCBUILD/webrtc/base/librtc_base_approved.a
    LIBS += -Wl,--end-group

    LIBS += $$WEBRTCNDK/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so 

    INCLUDEPATH += $$WEBRTC
    DEPENDPATH += $$WEBRTC
}
SOURCES += \
        main.cpp
票数 1
EN

Stack Overflow用户

发布于 2017-11-14 18:28:48

我不知道WebRTC-58,但我知道WebRTC 60有一个脚本可以为您构建Android库。在src/目录中,只运行

代码语言:javascript
复制
python tools_webrtc/android/build_aar.py

这将为您配置一切,为x86、x86_64、arm和arm64构建,并将它们组合成libwebrtc.aar,您可以将它们添加到安卓项目中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47264103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档