Ошибка связывания libwebrt c .a с C ++ на linux - PullRequest
0 голосов
/ 12 июля 2020

Я собрал webrt c для linux и получил libwebrtc.a, используя

gn gen out/Default --args=is_debug=false rtc_use_h264=true target_cpu="x64" target_os="linux" clang_use_chrome_plugins=false use_ghash=false symbol_level=2 use_custom_libcxx=false is_component_ffmpeg=true ffmpeg_branding="Chrome" rtc_include_tests=false rtc_build_examples=true rtc_build_tools=false use_rtti=true rtc_enable_protobuf=false rtc_use_h264=true rtc_link_pipewire=true proprietary_codecs=true

и

ninja -C . webrtc \
peerconnection_client

, но когда я пытаюсь связать stati c webrt c с моим проектом c ++ я получаю следующие 4 ошибки компоновщика:

1. test.cpp:(.text._ZN10H264BypassedEncoderC2ERKN7cricket10VideoCodecERNS_14DCVAgentClientE+0x191):
    undefined reference to   
    `absl::EqualsIgnoreCase(std::basic_string_view<char,   
    std::char_traits<char> >, std::basic_string_view<char,   
    std::char_traits<char> >)'
 2. CMakeFiles/webRTCserver.dir/src/audio/testEncoder.cpp.o:(.data.rel.ro._ZTVN10testEncoderE[_ZTVN10testEncoderE]+0xb8):
    undefined reference to
    `webrtc::AudioEncoder::OnReceivedUplinkBandwidth(int,
    std::optional<long>)'
 3. testDecoderFactory.cpp/testEncoderFactory.cpp:(.text._ZN10testEncoderFactory20GetSupportedEncodersEv+0x20b): undefined reference to
    `webrtc::SdpAudioFormat::SdpAudioFormat(std::basic_string_view<char,
    std::char_traits<char> >, int, unsigned long,
    std::map<std::__cxx11::basic_string<char, std::char_traits<char>,
    std::allocator<char> >, std::__cxx11::basic_string<char,
    std::char_traits<char>, std::allocator<char> >,
    std::less<std::__cxx11::basic_string<char, std::char_traits<char>,
    std::allocator<char> > >,
    std::allocator<std::pair<std::__cxx11::basic_string<char,
    std::char_traits<char>, std::allocator<char> > const,
    std::__cxx11::basic_string<char, std::char_traits<char>,
    std::allocator<char> > > > >&&)'
 4. H264BypassedEncoder.cpp.o:(.data.rel.ro._ZTVN10H264BypassedEncoderE[_ZTVN10H264BypassedEncoderE]+0x20):
    undefined reference to
    `webrtc::VideoEncoder::SetFecControllerOverride(webrtc::FecControllerOverride*)'

Когда я ищу символы в libwebrt c .a, как ошибка 2, как показано ниже:

nm --demangle libwebrtc.a | grep -i webrtc::AudioEncoder::OnReceivedUplinkBandwidth

Я получаю следующий вывод:

0000000000000000 T webrtc::AudioEncoder::OnReceivedUplinkBandwidth(int, absl::optional<long>)
                 U webrtc::AudioEncoder::OnReceivedUplinkBandwidth(int, absl::optional<long>)
                 U webrtc::AudioEncoder::OnReceivedUplinkBandwidth(int, absl::optional<long>)
                 U webrtc::AudioEncoder::OnReceivedUplinkBandwidth(int, absl::optional<long>)
                 U webrtc::AudioEncoder::OnReceivedUplinkBandwidth(int, absl::optional<long>)
                 U webrtc::AudioEncoder::OnReceivedUplinkBandwidth(int, absl::optional<long>)
                 U webrtc::AudioEncoder::OnReceivedUplinkBandwidth(int, absl::optional<long>)

Теперь я не уверен, почему nm показывает вывод именно так. Но затем, используя ar -d libwebrtc.a <*.o>, я удалил все файлы с

U webrtc::AudioEncoder::OnReceivedUplinkBandwidth(int, absl::optional<long>)

. Я все еще получаю ошибки компоновщика.

То же самое и с другими неопределенными ссылочными ошибками, кроме webrtc::VideoEncoder::SetFecControllerOverride, которые Я не уверен, какая цель предоставит.

Вопросы:

  • Может ли кто-нибудь подсказать мне другой способ отладки ошибок 1,2 и 3 как символы присутствуют в libwebrt c .a

  • В чем может быть причина того, что ошибки компоновщика 1 и 3 относятся к. cpp файлу, а не к файлу .o, как в ошибке 2

  • как найти цель ниндзя для сборки webrt c для устранения неопределенной ссылки ошибки 4?

EDIT: Как было предложено в комментарии, чтобы попробовать использовать is_clang = false, я сделал то же самое и получил следующую ошибку при создании файла libwebrt c .a:

[5/2977] CXX obj/api/libjingle_peerconnection_api/sctp_transport_interface.o
FAILED: obj/api/libjingle_peerconnection_api/sctp_transport_interface.o 
g++ -MMD -MF obj/api/libjingle_peerconnection_api/sctp_transport_interface.o.d -DUSE_UDEV -DUSE_AURA=1 -DUSE_GLIB=1 -DUSE_NSS_CERTS=1 -DUSE_X11=1 -DFULL_SAFE_BROWSING -DSAFE_BROWSING_CSD -DSAFE_BROWSING_DB_LOCAL -DCHROMIUM_BUILD -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D_FORTIFY_SOURCE=2 -DCR_SYSROOT_HASH=e7c53f04bd88d29d075bfd1f62b073aeb69cbe09 -DNDEBUG -DNVALGRIND -DDYNAMIC_ANNOTATIONS_ENABLED=0 -DWEBRTC_ENABLE_PROTOBUF=0 -DWEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE -DRTC_ENABLE_VP9 -DHAVE_SCTP -DWEBRTC_USE_H264 -DWEBRTC_LIBRARY_IMPL -DWEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0 -DWEBRTC_POSIX -DWEBRTC_LINUX -DABSL_ALLOCATOR_NOTHROW=1 -I../.. -Igen -I../../third_party/abseil-cpp -fno-strict-aliasing --param=ssp-buffer-size=4 -fstack-protector -funwind-tables -fPIC -pipe -B../../third_party/binutils/Linux_x64/Release/bin -pthread -m64 -march=x86-64 -Wno-builtin-macro-redefined -D__DATE__= -D__TIME__= -D__TIMESTAMP__= -Wall -Werror -Wno-unused-local-typedefs -Wno-maybe-uninitialized -Wno-deprecated-declarations -Wno-comments -Wno-packed-not-aligned -Wno-missing-field-initializers -Wno-unused-parameter -O2 -fno-ident -fdata-sections -ffunction-sections -fno-omit-frame-pointer -g2 -fvisibility=hidden -Wextra -Wno-unused-parameter -Wno-missing-field-initializers -std=gnu++11 -Wno-narrowing -Wno-class-memaccess -fno-exceptions --sysroot=../../build/linux/debian_sid_amd64-sysroot -fvisibility-inlines-hidden -Wnon-virtual-dtor -Woverloaded-virtual -c ../../api/sctp_transport_interface.cc -o obj/api/libjingle_peerconnection_api/sctp_transport_interface.o
In file included from /usr/include/c++/7/utility:68:0,
                 from ../../api/sctp_transport_interface.cc:11:
/usr/include/c++/7/x86_64-redhat-linux/bits/c++config.h:3:10: fatal error: bits/wordsize.h: No such file or directory
 #include <bits/wordsize.h>

1 Ответ

0 голосов
/ 18 июля 2020

Мне удалось исправить все проблемы, связанные со связыванием встроенного libwebrtc.a и встроенного исполняемого файла.

Может ли кто-нибудь подсказать мне другой способ отладки ошибок 1,2 и 3 поскольку символы присутствуют в libwebrt c .a

Используется cxx_std_17, а требуется cxx_std_14

Проблема заключается в использовании из cxx_std_17. В коде, который я создавал, использовались определенные методы, которые не были доступны по умолчанию cxx_std_11, поэтому я просто использовал cxx_std_17, но это вызвало много проблем с libwebrtc.a. Хотя webrt c руководство по стилю говорит, что код действительный c ++ 17 , но возникли проблемы. В том же руководстве по стилю упоминается, что код webrt c написан на C ++ 14, и это дало мне идею переключиться на cxx_std_14 и устранить ошибки. Как упоминается в том же webrt c руководстве по стилю , что «Некоторые старые части кода по-разному нарушают руководство по стилю». поэтому я думаю, что есть какой-то более старый код, который вызвал ошибки

Что может быть причиной того, что ошибки компоновщика 1 и 3 относятся к. cpp файлу, а не файлу .o как в случае ошибки 2

Я думаю, что причина. cpp или .o в том, что если ошибка возникла в моем коде, она отображается. cpp, но если она в Сторонняя библиотека, как и в случае с несколькими ошибками компоновщика, возникшими из libwebrt c .a, затем отображается ошибка в файле .o, поскольку библиотека содержит только скомпилированные файлы

как найти цель ниндзя для сборки webrt c, чтобы устранить неопределенную ссылку ошибки 4?

Проблема была с фиксацией, которую я пытался построить.

Из webrt c примечания к выпуску Я обнаружил стабильную фиксацию m77 head и обнаружил, что фиксация, которую я использовал, не имела функций, в которых была ошибка компоновщика ссылаясь на но главный коммит стабильной ветки m77 имеет эти функции.

* 10 53 *

ПРИМЕЧАНИЕ: В общем, чтобы получить цель, которая имеет файл .o с требуемым символом, нам просто нужно сделать grep, и он перечислит, где определена функция, связанная с символом, и ninja -t targets all отобразит все цели. Так что просто go в соответствующий .ninja файл, скопируйте все .o файлы в webrtc.ninja и снова создайте libwebrtc.a.

...