由于对具有std :: string

时间:2017-11-17 10:20:14

标签: c++ c++11 gcc webrtc

我正在尝试使用以下

构建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.a librtc_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我得

找-iname' .a ' - exec nm -A -C {} \; | grep'T rtc :: FatalMessage :: FatalMessage('

./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 {} \; | 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*)

请帮助

1 个答案:

答案 0 :(得分:6)

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

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

您需要使用clang并传递

<强> -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