webrtc.node: undefined symbol: _ZN3rtc10DIGEST_MD5E
编译webrtc的debug版本遇到这个错误
undefined symbol问题的查找、定位与解决方法
https://blog.csdn.net/buknow/article/details/96130049
ild$ ldd -r ./Debug/obj.target/webrtc.node
linux-vdso.so.1 (0x00007ffd1a1e4000)
liblog4cxx.so.10 => /usr/lib/x86_64-linux-gnu/liblog4cxx.so.10 (0x00007f9a780d9000)
libboost_thread.so.1.65.1 => /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.65.1 (0x00007f9a77eb4000)
libboost_system.so.1.65.1 => /usr/lib/x86_64-linux-gnu/libboost_system.so.1.65.1 (0x00007f9a77caf000)
libnice.so.10 => not found
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f9a77926000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f9a77588000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f9a77370000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9a77151000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9a76d60000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9a79312000)
libapr-1.so.0 => /usr/lib/x86_64-linux-gnu/libapr-1.so.0 (0x00007f9a76b2b000)
libaprutil-1.so.0 => /usr/lib/x86_64-linux-gnu/libaprutil-1.so.0 (0x00007f9a76900000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f9a766f8000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f9a764f1000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9a762ed000)
libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007f9a760b5000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f9a75e83000)
undefined symbol: _ZN3rtc10DIGEST_MD5E (./Debug/obj.target/webrtc.node)
undefined symbol: _ZN3rtc12DIGEST_SHA_1E (./Debug/obj.target/webrtc.node)
undefined symbol: nice_candidate_free (./Debug/obj.target/webrtc.node)
undefined symbol: _ZN2v86String9Utf8ValueC1ENS_5LocalINS_5ValueEEE (./Debug/obj.target/webrtc.node)
undefined symbol: _ZN2v816FunctionTemplate11GetFunctionEv (./Debug/obj.target/webrtc.node)
c++filt _ZN3rtc10DIGEST_MD5E
rtc::DIGEST_MD5
根据网上查到的资料,确认一下链接的静态库顺序是否正确。直接在第三方源码中全局搜索报错的字符串“DIGEST_MD5”,发现有两处cpp文件中存在,一处是声明定义的,另一处是调用的。
/src$ grep DIGEST_MD5 ./ -rs
匹配到二进制文件 ./out/obj/webrtc/p2p/rtc_p2p/stun.o
匹配到二进制文件 ./out/obj/webrtc/p2p/rtc_p2p/turnserver.o
匹配到二进制文件 ./out/obj/webrtc/p2p/librtc_p2p.a
/webrtc/base/openssldigest.cc: *algorithm = DIGEST_MD5;
./webrtc/p2p/base/turnserver.cc: nonce += rtc::ComputeHmac(rtc::DIGEST_MD5, nonce_key_, input);
./webrtc/p2p/base/turnserver.cc: rtc::DIGEST_MD5, nonce_key_, std::string(p, sizeof(then)))) {
./webrtc/p2p/base/stun.cc: rtc::DIGEST_MD5, input.c_str(), input.size(),
test@test-virtual-machine:~/code/owt-server/third_party/webrtc/src$
在turnserver.cc和stun.cc文件中添加如下
const char DIGEST_MD5[] = "md5";
去掉 rtc::DIGEST_MD5前面的rtc::, 改成DIGEST_MD5