首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于对具有std::string的方法的未定义引用而链接webrtc-本机错误

由于对具有std::string的方法的未定义引用而链接webrtc-本机错误
EN

Stack Overflow用户
提问于 2017-11-17 10:20:14
回答 1查看 4.5K关注 0票数 6

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

代码语言:javascript
复制
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,我都会得到以下错误

代码语言:javascript
复制
undefined reference to `rtc::FatalMessage::FatalMessage(char const*, int, std::string*)'

代码语言:javascript
复制
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.a和librtc_base.a,但是没有运气。生成此错误的示例程序是

代码语言:javascript
复制
#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 << "!World!" << endl; // prints !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链接器

代码语言:javascript
复制
g++ -L/home/test/webrtc-checkout-ankur/src/out_release_62/x64/Debug -o "testwebrtc"  ./src/testwebrtc.o   -lwebrtc -lwebrtc_common -lpthread -lm -ldl

这是返回的错误。

代码语言:javascript
复制
./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,这个构建是在一个ubuntu16.04系统上完成的。

在构建的库上运行nm

查找-iname '.a‘-exec nm -A -C {} \\x\x{}> grep 'T rtc::FatalMessage::FatalMessage()

代码语言:javascript
复制
./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> >*)

查找-iname '.a‘-exec nm -A -C {} \\x grep 'CreateSessionDescription(’

代码语言:javascript
复制
./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*)

请帮帮忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-20 03:44:05

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

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

你需要使用嘎吱声和传球

-stdlib=libstdc++

到编译器命令行。

__1表示我们使用的是libc++ llvm-clang库,这是webrtc构建的默认设置。

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

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

构建webrtc以使用libstdc++,让gn知道我们打算使用libstdc++,我们将use_custom_libcxx=false和use_custom_libcxx_for_host=false作为args传递给

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

https://stackoverflow.com/questions/47348330

复制
相关文章

相似问题

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