我试图为Android构建一个共享库,它引用了webrtc-58为Android构建的libjingle_peerconnection.so,但是链接器出现了错误:
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上
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 \发布于 2017-11-16 22:27:27
我的同事今天解决了这个问题。他用webrtc构建输出中的另一个库替换了libjingle_peerconnection.so
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文件将如下所示
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发布于 2017-11-14 18:28:48
我不知道WebRTC-58,但我知道WebRTC 60有一个脚本可以为您构建Android库。在src/目录中,只运行
python tools_webrtc/android/build_aar.py这将为您配置一切,为x86、x86_64、arm和arm64构建,并将它们组合成libwebrtc.aar,您可以将它们添加到安卓项目中。
https://stackoverflow.com/questions/47264103
复制相似问题