链接webrtc本机时出错,因为未定义对具有std::string的方法的引用
Error linking webrtc-native due to undefined reference to methods having std::string
我正在尝试使用以下构建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我得到
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
- 为什么可以将左值传递给"std::async",即使它引用了右值
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 未定义的引用,尽管存在符号,但 std::experimental::可选
- std::iterator::reference 必须是引用吗?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- std::unordered_map::提取引用/指针失效
- 对 'std::thread::_M_start_thread CMake 的未定义引用进行基准测试
- 修改在 std::future 的 lambda 中引用捕获的值
- 更改其类型后,丢失对 std::variant 对象的引用
- 引用 std::any 或 not_yet_in_std::whatever 的惯用方式是什么?
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- std::thread 增加 DLL 引用计数,从而防止卸载 DLL
- 在 C++20 之前,在带有常量或引用字段的"A"上调用 'std::vector<A>
- 引用 std::shared:ptr 以避免引用计数
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- std::is_class 在引用类上为 false
- 通过引用传递向量是请求 std::分配器
- 非默认可构造和 std::引用包装器替代项的序列化
- std::引用类型的可选专用化