链接webrtc本机时出错,因为未定义对具有std::string的方法的引用

Error linking webrtc-native due to undefined reference to methods having std::string

本文关键字:std 引用 string 方法 本机 webrtc 出错 未定义 因为 链接      更新时间:2023-10-16

我正在尝试使用以下构建webrtc版本62

1.git checkout -b branch62 refs/remotes/branch-heads/62
2.gn gen out_release_62/x64/Debug --args="rtc_include_tests=false rtc_use_h264=false use_rtti=true is_component_build=false enable_iterator_debugging=false enable_nacl=false target_os="linux" target_cpu="x64" is_debug=true"
3.ninja -C out_release_62/x64/Debug

我正在链接到libwebrtc.a和libwebrtc_common.a

但无论我在哪里尝试使用RTC_CHECK_EQ或RTC_DCHECK_LT,我都会得到以下错误

undefined reference to `rtc::FatalMessage::FatalMessage(char const*, int, std::string*)'

out_release_62/include/webrtc/rtc_base/checks.h:176: undefined reference to `std::string* rtc::MakeCheckOpString<int, int>(int const&, int const&, char const*)'
./src/testwebrtc.o: In function `rtc::CheckLtImpl(int, int, char const*)':

我对构建分支头60没有意见,我尝试链接到librtc_base.alibrtc_base_approved.a,但没有成功。产生此错误的示例程序是

#include <iostream>
#include <string>
#include <webrtc/rtc_base/checks.h>
#include <webrtc/rtc_base/ssladapter.h>
#include <webrtc/rtc_base/logging.h>
#include <webrtc/api/peerconnectioninterface.h>
using namespace std;
int main() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
std::string type;
std::string sdp;
webrtc::SdpParseError error;
webrtc::CreateSessionDescription(type,sdp,&error);
RTC_DCHECK(5);
RTC_CHECK_EQ(1,6);
RTC_DCHECK_LT(1,4);
return 0;
}

gcc verison 6.3链接器

g++ -L/home/test/webrtc-checkout-ankur/src/out_release_62/x64/Debug -o "testwebrtc"  ./src/testwebrtc.o   -lwebrtc -lwebrtc_common -lpthread -lm -ldl

这是返回的错误

./src/testwebrtc.o: In function `main':
/home/test/workspace/testwebrtc/Debug/../src/testwebrtc.cpp:22: undefined reference to `webrtc::CreateSessionDescription(std::string const&, std::string const&, webrtc::SdpParseError*)'
/home/test/workspace/testwebrtc/Debug/../src/testwebrtc.cpp:24: undefined reference to `rtc::FatalMessage::FatalMessage(char const*, int, std::string*)'
/home/test/workspace/testwebrtc/Debug/../src/testwebrtc.cpp:25: undefined reference to `rtc::FatalMessage::FatalMessage(char const*, int, std::string*)'
./src/testwebrtc.o: In function `rtc::CheckEqImpl(int, int, char const*)':
makefile:45: recipe for target 'testwebrtc' failed
/home/test/webrtc-checkout-ankur/src/out_release_62/include/webrtc/rtc_base/checks.h:176: undefined reference to `std::string* rtc::MakeCheckOpString<int, int>(int const&, int const&, char const*)'
./src/testwebrtc.o: In function `rtc::CheckLtImpl(int, int, char const*)':
/home/test/webrtc-checkout-ankur/src/out_release_62/include/webrtc/rtc_base/checks.h:179: undefined reference to `std::string* rtc::MakeCheckOpString<int, int>(int const&, int const&, char const*)'
collect2: error: ld returned 1 exit status

根据我的观察,任何包含std::string的函数/方法都显示出这种行为。_GLIBCXX_USE_CXX11_ABI=0已设置,-std=c++0x,此构建是在ubuntu 16.04系统上完成的。

在构建的库上运行nm我得到

find-iname'.a'-exec nm-a-C{}\;|grep'T rtc::致命消息::致命消息('

./Debug/obj/webrtc/rtc_base/librtc_base_approved.a:checks.o:00000000000001a0 T rtc::FatalMessage::FatalMessage(char const*, int)
./Debug/obj/webrtc/rtc_base/librtc_base_approved.a:checks.o:00000000000005e0 T rtc::FatalMessage::FatalMessage(char const*, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*)
./Debug/obj/webrtc/rtc_base/librtc_base_approved.a:checks.o:00000000000001a0 T rtc::FatalMessage::FatalMessage(char const*, int)
./Debug/obj/webrtc/rtc_base/librtc_base_approved.a:checks.o:00000000000005e0 T rtc::FatalMessage::FatalMessage(char const*, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*)
./Debug/obj/webrtc/libwebrtc.a:checks.o:00000000000001a0 T rtc::FatalMessage::FatalMessage(char const*, int)
./Debug/obj/webrtc/libwebrtc.a:checks.o:00000000000005e0 T rtc::FatalMessage::FatalMessage(char const*, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*)
./Debug/obj/webrtc/libwebrtc.a:checks.o:00000000000001a0 T rtc::FatalMessage::FatalMessage(char const*, int)
./Debug/obj/webrtc/libwebrtc.a:checks.o:00000000000005e0 T rtc::FatalMessage::FatalMessage(char const*, int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >*)

find-iname'.a'-exec nm-a-C{}\;|grep"CreateSessionDescription(">

./Debug/obj/webrtc/pc/libpeerconnection.a:jsepsessiondescription.o:0000000000000000 T webrtc::CreateSessionDescription(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, webrtc::SdpParseError*)
./Debug/obj/webrtc/libwebrtc.a:jsepsessiondescription.o:0000000000000000 T webrtc::CreateSessionDescription(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, webrtc::SdpParseError*)

请帮助

您有一个标准的lib不匹配:一方面使用std::string,另一方面使用std::__1::basic_string

换句话说:一方面使用libc++,另一方面使用librstdc++

你需要使用clang并通过

-stdlib=libstdc++

到编译器命令行。

__1表示我们正在使用libc++llvm clang库,这是webrtc构建的默认库

__1是libc++使用的内联命名空间,

为了解决这个特殊的问题,当我们链接到libwebrtc、时,我们应该在应用程序中使用libc++而不是libstdc++

构建webrtc以使用libstdc++,为了让gn知道我们打算使用libstdc++,我们将use_custom_libccxx=false和use_custom/libccxx_for_host=false作为args