我正在尝试在 Windows 上的 Visual Studio 项目中编译和使用 static WebRTC against OpenSSL 1.1.1,这是我的 gn 行:
gn gen ./intermediate --args="target_cpu=\"x64\" use_rtti=false is_debug=true symbol_level=2 enable_iterator_debugging=true rtc_build_tools=false rtc_build_examples=false rtc_include_tests=false enable_precompiled_headers=false use_cxx11=false use_custom_libcxx=false use_custom_libcxx_for_host=false rtc_build_ssl=false rtc_ssl_root=\"C:/libs/OpenSSL/include:\=\\%\" rtc_build_json=false rtc_jsoncpp_root=\"C:/libs/JsonCpp/include:\=\\%\" is_clang=false is_component_build=false use_lld=false dcheck_is_configurable=true"
编译没问题,但在我的 Visual Studio 2019 项目中,我在链接器步骤中遇到了这些 1156 错误:
1 - libssl.lib(ssl_lib.obj) : error LNK2005: SSL_CTX_check_private_key already defined in webrtc.lib(ssl_lib.obj)
2 - libssl.lib(ssl_lib.obj) : error LNK2005: SSL_CTX_clear_options already defined in webrtc.lib(ssl_lib.obj)
3 - libssl.lib(ssl_lib.obj) : error LNK2005: SSL_CTX_free already defined in webrtc.lib(ssl_lib.obj)
4 - libssl.lib(ssl_lib.obj) : error LNK2005: SSL_CTX_get0_certificate already defined in webrtc.lib(ssl_x509.obj)
...
1154 - libcrypto.lib(p12_asn.obj) : error LNK2005: d2i_PKCS12 already defined in webrtc.lib(pkcs8_x509.obj)
1155 - libcrypto.lib(p12_asn.obj) : error LNK2005: i2d_PKCS12 already defined in webrtc.lib(pkcs8_x509.obj)
1156 - libcrypto.lib(asn1_par.obj) : error LNK2005: ASN1_tag2str already defined in webrtc.lib(asn1_par.obj)
我理解附加此内容是因为 libssl.lib 和 libcrypto.lib 已经聚合在 webrtc.lib 中。但在这个项目中,我还使用了 Curl 和 LibWebSocket,它们也依赖于相同的 OpenSSL 静态库,当我尝试从链接器输入中删除 libssl.lib 和 crypto.lib 时,会失败并出现 67 个未解析的符号:
1 - websockets_static.lib(openssl-server.obj) : error LNK2001: unresolved external symbol SSL_ctrl
2 - webrtc.lib(openssl_adapter.obj) : error LNK2001: unresolved external symbol SSL_ctrl
...
66 - libcurl.lib(openssl.obj) : error LNK2019: unresolved external symbol ENGINE_set_default referenced in function x509_name_oneline
67 - websockets_static.lib(openssl-server.obj) : error LNK2019: unresolved external symbol SSL_CTX_callback_ctrl referenced in function lws_tls_server_vhost_backend_init
所以我的感觉是,在webrtc.lib的编译过程中,只聚合了webrtc.lib需要的libssl.lib和crypto.lib的一部分
我的问题是:如何在webrtc编译过程中避免子库聚合?选项rtc_build_ssl = false似乎没有效果...该选项是什么以及我可以在哪里传递它?
在遇到与你相同的问题后,我切换到最新的 OpenSSL 版本 3.0.0-beta2-dev,然后我就不再看到所有这些“已定义”了。
这意味着我可以毫无错误地编译和链接,但不幸的是它不起作用并停止在
OpenSSLDigest::GetDigestEVP()
。所以WebRTC似乎不支持OpenSSL 3.0.0。与此同时,您是否设法使用 OpenSSL 1.1.1 对其进行编译、链接和运行?
我遇到了同样的问题。你解决了吗
gn gen out/Release --args="is_debug=false is_component_build=false rtc_include_tests=false use_custom_libcxx=false symbol_level=0 rtc_enable_symbol_export=false use_rtti=true rtc_build_examples=false rtc_build_ssl=false rtc_ssl_root=\"C:\OpenSSL-Win64\include""
我使用 rtc_build_ssl = false 。但我发现,boringssl仍然编译并链接
我找到了使用 openssl 构建 WebRTC 的解决方案。我为 iOS 进行了构建,但也许它对其他平台也有用。我的 openssl 版本是 1.1.1,webrtc 版本是答复日期的最新版本。
我的 gn 配置:
gen gen out/iosrelease -args ='target_os =“ ios” is_debug = false ios_deployment_target =“ 13.0” rtc_include_tests = false enable_run_ios_run_ios_unittss_unitts_with_with_with_with_with_with_with_with_with_xctest = false_cpu = false_cpu =“ arm64” target =“ arm64” om_libcxx = false use_rtti = true rtc_build_ssl = false rtc_ssl_root =“/Users/mymac/Developer/openssl-1.1.1”'
rtc_ssl_root和rtc_build_ssl是不够的。还需要链接库。打开 .gn 文件 yourWebrtcFolder/src/rtc_base/BUILD.gn
替换这几行
if (!rtc_build_ssl) {
config("external_ssl_library") {
assert(rtc_ssl_root != "",
"You must specify rtc_ssl_root when rtc_build_ssl==0.")
include_dirs = [ rtc_ssl_root ]
}
}
与
if (!rtc_build_ssl) {
config("external_ssl_library") {
assert(rtc_ssl_root != "",
"You must specify rtc_ssl_root when rtc_build_ssl==0.")
include_dirs = [ "$rtc_ssl_root/include" ]
libs = [
"$rtc_ssl_root/libssl.a",
"$rtc_ssl_root/libcrypto.a",
]
}
}
确保您已经构建了 openssl,并且在 openssl-1.1.1 根目录中有 libssl.a 和 libcrypto.a。
添加链接到标头并链接库仍然不够 - WebRTC 仍然构建 Boringssl 并导致与 openssl 冲突...正如出现的 Boringssl 配置被硬编码在其他一些 .gn 文件中一样。我使用带有搜索参数“third_party/boringssl:boringssl”的 Finder 来查找它。就我而言,它是 4 个文件:
src/thirt_party/netty-tcnative/BUILD.gn, src/third_party/libsrtp/BUILD.gn, src/third_party/mearby/BUILD.gn, src/third_party/shell-加密/BUILD.gn。
所以我必须删除 public_deps 中所有的“//third_party/boringssl:boringssl”并将“//rtc_base:external_ssl_library”添加到 public_configs 中。
例如:
public_configs += [ "//rtc_base:external_ssl_library" ]
public_deps = [
#"//third_party/boringssl:boringssl",
]
仅此而已。