在Android NDK项目中使用webrtc-58 - 使用QT构建时"Undefined reference to CopyOnWriteBuffer"
Using webrtc-58 in Android NDK project - "Undefined reference to CopyOnWriteBuffer" when building with QT
我正在尝试为Android NDK构建一个共享库,该库引用了webrtc-58为Android构建的libjingle_peerconnection.so,但出现了链接器错误:
MyProjectLibswebrtc-58includewebrtcapidatachannelinterface.h:64: error: undefined reference to 'rtc::CopyOnWriteBuffer::~CopyOnWriteBuffer()'
MyProjectLibswebrtc-58includewebrtcbasecopyonwritebuffer.h:48: error: undefined reference to 'rtc::CopyOnWriteBuffer::CopyOnWriteBuffer(unsigned int, unsigned int)'
我在 Ubuntu 和 Windows 上构建项目的输出相同。在 Ubuntu 上构建时,我将 QT Creator 配置为使用 webrtc 构建工具中的 Android SDK/NDK(用于构建libjingle_peerconnection
QT 创建器 4.4.1 在 Qt5.9.2 上 webrtc-58 是在 Ubuntu 上构建的,使用以下配置。
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 类实现:
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的内容
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
我的同事今天解决了这个问题。他用webrtc build output的另一个库替换了libjingle_peerconnection.so。
obj/webrtc/api/libjingle_peerconnection_api.a
ob/webrtc/base/librtc_base_approved.a
QT Android Kit和webrtc构建系统也存在兼容性问题,所以Android Kit是用gnustl构建的,而webrtc是用libc++构建的,所以他包含了Android NDK捆绑包中的libc++_shared.so。整个Pro文件将如下所示
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
我不了解WebRTC-58,但我知道WebRTC 60有一个脚本可以为你构建Android库。 从 src/目录中,只需运行
python tools_webrtc/android/build_aar.py
这将为您配置所有内容,为 x86、x86_64、arm 和 arm64 构建,并将它们组合到 libwebrtc.aar 中,您可以将其添加到您的 android 项目中。
相关文章:
- 使用静态 Qt 构建在 Linux 上部署 Qt5 应用程序
- 是否可以在没有QT构建的QT应用程序中部署QT应用程序
- 在Android NDK项目中使用webrtc-58 - 使用QT构建时"Undefined reference to CopyOnWriteBuffer"
- 找不到构造函数 - 如何将 CPP 文件添加到 Qt 构建过程
- 将 exe 文件复制到 Qt 构建目录
- Qt构建发布库和调试库
- 使用qt构建qt-make项目时出错
- 错误LNK2001 - VS2008 和 Qt 构建
- 在 Mac 10.11 上使用 QT 5.6 构建 QtWebKit
- 使用 Qt 5.1.1 构建 QwtPlot3d 时缺少库文件
- Qt 5.5 构建自定义 QTreeView
- 在 OS X 10.8.5 上使用 Xcode 5.0 和 Qt 5.1.1 构建问题
- Qt 5.1 - 构建时出现"Add library"错误。LNK2019
- 如何使用Qt构建静态库和可执行文件
- 如何使用Qt构建命令窗口
- 我需要Qt工具链来针对用Qt构建的库吗
- 在Windows上使用QT 5.6构建QtWebKit
- Qt构建错误:g++-4.2:没有这样的文件或目录
- 在Windows 10上为Qt构建WMF (Windows Media Foundation)媒体驱动插件
- 使用libchive在Qt -构建错误