【问题标题】:Electron builder fails with: no 'object' file generated电子生成器失败:没有生成“对象”文件
【发布时间】:2020-10-05 07:31:20
【问题描述】:

自从升级到 Electron 10.1.2 后,electron-builder 出现问题。我的构建现在在为keyboard-layout 重建时失败。重建仅适用于 Windows,而不适用于 Mac。我不知道在哪里打开这个问题,所以我在这里问:)。


我的设置:

  • 角度:9.0.7
  • 电子:10.1.2
  • 电子生成器:22.8.x

当我将 electron9.0.0 更新到 10.1.2 时,问题就开始了。其他没有任何变化。


问题:
当使用命令electron-builder.cmd --x64 -p always -w 调用electron-builder 时,keyboard-layout 的重建被称为以下步骤之一:

> keyboard-layout@2.0.16 install C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout
> node-gyp rebuild

失败了:

...
 win_delay_load_hook.cc
    c:\users\<me>\.electron-gyp\10.1.2\include\node\v8.h(5378): error C2220: warning treated as error - no 'object' file generated (compiling source file ..\src\keyboard-layout-manager-windows.cc) [C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\keyboard-layout-manager.vcxproj]
    c:\users\<me>\.electron-gyp\10.1.2\include\node\v8.h(5378): warning C4309: 'static_cast': truncation of constant value (compiling source file ..\src\keyboard-layout-manager-windows.cc) [C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\keyboard-layout-manager.vcxproj]
    c:\users\<me>\.electron-gyp\10.1.2\include\node\v8.h(5378): error C2220: warning treated as error - no 'object' file generated (compiling source file ..\src\keyboard-layout-manager.cc) [C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\keyboard-layout-manager.vcxproj]
    c:\users\<me>\.electron-gyp\10.1.2\include\node\v8.h(5378): warning C4309: 'static_cast': truncation of constant value (compiling source file ..\src\keyboard-layout-manager.cc) [C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\keyboard-layout-manager.vcxproj]
    Done Building Project "C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\keyboard-layout-manager.vcxproj" (default targets) -- FAILED.
    Done Building Project "C:\Users\<me>\<dir1>\<dir2>\dist\node_modules\keyboard-layout\build\binding.sln" (default targets) -- FAILED.

    Build FAILED.
...

我尝试过的没有帮助:
node_modules/keyboard-layout 中的binding.gyp 更改为(标有&lt;--- 的更改):

['OS=="win"', {
         "sources": [
           "src/keyboard-layout-manager-windows.cc",
         ],
         'msvs_settings': {
           'VCCLCompilerTool': {
             'ExceptionHandling': 1, # /EHsc
             'WarnAsError': 'false', # <--- I chnaged this from true to false
           },
         },
         'msvs_disabled_warnings': [
           4018,  # signed/unsigned mismatch
           2220,  # <--- I added this
           4244,  # conversion from 'type1' to 'type2', possible loss of data
           4267,  # conversion from 'size_t' to 'type', possible loss of data
           4302,  # 'type cast': truncation from 'HKL' to 'UINT'
           4311,  # 'type cast': pointer truncation from 'HKL' to 'UINT'
           4530,  # C++ exception handler used, but unwind semantics are not enabled
           4506,  # no definition for inline function
           4577,  # 'noexcept' used with no exception handling mode specified
           4996,  # function was declared deprecated
         ],
       }],  # OS=="win"

我尝试过的 DID 帮助:
Electron 10.x.y 将 v8 更新到 8.5 (Electron 10.0.0 release notes) 并查看导致错误的行 (...\.electron-gyp\10.1.2\include\node\v8.h(5378)) 我看到了这个:

 static constexpr size_t kMaxLength =
      internal::kApiSystemPointerSize == 4
          ? internal::kSmiMaxValue
          : static_cast<size_t>(uint64_t{1} << 32); <--- Line 5378

当我比较来自 ...\.electron-gyp\10.1.2\include\node\v8.h...\.electron-gyp\9.0.0\include\node\v8.h 的 v8.h 文件时,这一行发生了变化。

旧版本中的同一行:

  static constexpr size_t kMaxLength = internal::kApiSystemPointerSize == 4
                                           ? internal::kSmiMaxValue
                                           : 0xFFFFFFFF;

如果我将static_cast&lt;size_t&gt;(uint64_t{1} &lt;&lt; 32) 更改为0xFFFFFFFF构建成功。


我的理解到此结束。

  1. 新旧线路理论上不一样吗?一个移位 32 位的结果是 0xFFFFFFFF?
  2. 我可以做些什么来解决这个问题?这个变化的原因是什么?
  3. 为什么这个问题只出现在 Windows 上?

【问题讨论】:

    标签: electron v8 electron-builder keyboard-layout


    【解决方案1】:

    我尝试过的没有帮助:

    'WarnAsError': 'false' 应该可以解决问题;但是对于两个不同的文件(..\src\keyboard-layout-manager.cc..\src\keyboard-layout-manager-windows.cc)报告了错误,因此您必须修改它们的构建规则。

    禁用警告也应该有帮助,但它必须是警告 4309(不是 2220),您需要禁用它。同样,您必须对两个文件(或仅对整个编译)都这样做。

    新旧线路理论上不一样吗?一个移位 32 位的结果是 0xFFFFFFFF?

    不,1 &lt;&lt; 32 == 0x100000000 == 0xFFFFFFFF + 1)。

    我可以做些什么来解决这个问题?

    • 关闭'WarnAsError' 应该会有所帮助
    • 关闭警告 4309 应该会有所帮助
    • 还原本地结帐中的那一行应该会有所帮助
    • 使用 Clang 代替 MSVC 应该会有所帮助
    • 可能使用不同(更新?)版本的 MSVC 也会有所帮助

    这种变化的原因是什么?

    V8 现在允许 TypedArrays 最多包含 2**32 元素,这比以前多了一个元素。

    为什么这个问题只出现在 Windows 上?

    因为警告是特定于编译器的,而 MSVC 仅在 Windows 上使用。

    奇怪的是,您首先看到了这个错误。你用--x64编译;如果听起来确实如此,那么您应该编译一个 64 位版本,其中 internal::kApiSystemPointerSize == 8size_tuint64_t 一样具有 64 位,因此在表达式 static_cast&lt;size_t&gt;(uint64_t{1} &lt;&lt; 32); 中没有任何内容被截断。

    即使出于某种原因,此构建尝试创建 V8 的 32 位构建,也应该采用另一个分支 (internal::kApiSystemPointerSize == 4),并且编译器应该足够聪明,不会警告无论如何静态死的分支.

    无论如何,这似乎是一个编译器错误/限制。因此,适当的解决方法是更新您的编译器,或禁用错误警告。

    【讨论】:

    • 感谢您的详细解释。你是对的,'WarnAsError': 'false' 确实有帮助,当我改变它时,它被其他一些命令运行了:S。还有一个问题。如果我禁用警告,模块是否仍会正确构建,还是我只会让问题消失?
    • 它应该可以正确构建——否则你手上会有一个相当严重的编译器错误,而且这些错误非常罕见:-)
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 2017-06-13
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多