WebRTC 也不是为 Windows 构建的

Posted

技术标签:

【中文标题】WebRTC 也不是为 Windows 构建的【英文标题】:WebRTC not building for Windows too 【发布时间】:2017-09-03 13:38:04 【问题描述】:

就像在这个问题WebRTC not building for Windows 中一样,我无法在带有 VS 2015 的 Windows 7 64 位上构建 WebRTC,但问题有所不同。 fetchgclient 同步 顺利进行,没有错误。但是当我运行 gn gen out/WebRTC 时,出现以下错误

ERROR at //third_party/protobuf/proto_library.gni:229:15: File is not inside out
put directory.
    outputs = get_path_info(protogens, "abspath")
              ^---------------------------------
The given file should be in the output directory. Normally you would specify
"$target_out_dir/foo" or "$target_gen_dir/foo". I interpreted this as
"//out/Default/gen/webrtc/rtc_tools/event_log_visualizer/chart.pb.h".
See //webrtc/rtc_tools/BUILD.gn:184:3: whence it was called.
  proto_library("chart_proto") 
  ^-----------------------------
See //BUILD.gn:16:5: which caused the file to be included.
"//webrtc/rtc_tools",
^-------------------
Traceback (most recent call last):
  File "D:/temp/webrtc-checkout/src/build/vs_toolchain.py", line 459, in <module>
    sys.exit(main())
  File "D:/temp/webrtc-checkout/src/build/vs_toolchain.py", line 455, in main
    return commands[sys.argv[1]](*sys.argv[2:])
  File "D:/temp/webrtc-checkout/src/build/vs_toolchain.py", line 431, in GetTool
chainDir
    win_sdk_dir = SetEnvironmentAndGetSDKDir()
  File "D:/temp/webrtc-checkout/src/build/vs_toolchain.py", line 424, in SetEnvi
ronmentAndGetSDKDir
    return NormalizePath(os.environ['WINDOWSSDKDIR'])
  File "D:\temp\depot_tools\win_tools-2_7_6_bin\python\bin\lib\os.py", line 423,
 in __getitem__
    return self.data[key.upper()]
KeyError: 'WINDOWSSDKDIR'

我尝试添加上述问题中提到的变量,但没有帮助。 任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您需要在环境变量(windows sdk)中设置 LIB 和 INCLUDE。 并将PATH设置为正确的python版本(我认为是2.7.6)。

所以你的环境变量应该是:

LIB=C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\ucrt\x64;
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x64

INCLUDE=C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\shared;
C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt;
C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um;
C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\winrt

PATH=C:\src\depot_tools\python276_bin\

如果有效请标记

【讨论】:

【参考方案2】:

libwebrtc

我正在使用来自https://github.com/cloudwebrtc/libwebrtc-build 的 libwebrtc,其中该编译包含在 CMake 自定义调用中,我尝试修改 LIB/INCLUDE,但您可能指的是 Visual Studio IDE 变量(命令行没有或在哪里它不像我预期的那样工作)。

我现在的保守解决方案是在 libwebrtc 编译之前打印此消息:

if(NOT EXISTS "C:/Program Files (x86)/Windows Kits/10/Redist/ucrt")
message("============================== C:/Program Files (x86)/Windows Kits/10/Redist/ucrt missing ==========================")
message("C:/Program Files (x86)/Windows Kits/10/Redist/ucrt can not be found")
message(" normally it contains files like /DLLs/x64/ucrtbase.dll and is required for libwebrtc to build")
message(FATAL_ERROR "Please copy the directory C:/Program Files (x86)/Windows Kits/10/Redist/10.0.18362.0/ucrt into C:/Program Files (x86)/Windows Kits/10/Redist/")
endif(NOT EXISTS "C:/Program Files (x86)/Windows Kits/10/Redist/ucrt")

另一种方法是将https://github.com/nareix/webrtc.build/blob/69e87f529e935111b2b8c774ce283366fa2157d0/vs_toolchain.py#L212 修补为(伪代码):

ucrt_dll_dirs = os.path.join("C:/Program Files (x86)/Windows Kits/10/Redist/10.0.18362.0/", 'DLLs', target_cpu)

但是由于该 python 代码是从 libwebrtc 签出的,并且可能会定期被覆盖,所以我使用手动解决方案。

xcopy(手动复制文件)

xcopy /Y /E /I "c:\Program Files (x86)\Windows Kits\10\Redist\10.0.18362.0\ucrt" "c:\Program Files (x86)\Windows Kits\10\Redist\

交替讨论

https://bugs.chromium.org/p/webrtc/issues/detail?id=7677#c24 中提出的所有解决方案对我来说也都失败了。

希望

我只是希望 python 开发人员会使用另一个环境变量,我们可以在其中传递目录以查看。甚至更好的是,为什么微软首先要创建如此糟糕的基础架构-> 在 UNIX 上,可以使用“pkg-config”的概念来进行自定义库检测。

【讨论】:

以上是关于WebRTC 也不是为 Windows 构建的的主要内容,如果未能解决你的问题,请参考以下文章

为 iOS 构建 webrtc 库时出错

RTC技术(WebRTC)

如何修改webrtc的工程(vs 2017)

什么项目将使用 websocket 而不是 webrtc?

架构 armv7 (WebRTC) 的未定义符号

架构 armv7 (WebRTC) 的未定义符号