我正在 win10 pro 20H2 版本上编译 v8。
我已经获取了源代码 并使用
gn gen --ide=vs out\x64_proj
目录下的 v8\src
命令生成 Visual Studio 项目。
上面的过程中存在一些小问题,比如env变量,proxy。但我修好了它们。
当我开始在我的 vs2019 中编译
gn_all
项目时,出现了一些错误。
大多数都非常相似:
1>In file included from ../../../src/base/debug/stack_trace_win.cc:17:
1>In file included from D:\Windows Kits\10\Include\10.0.19041.0\um\windows.h:172:
1>In file included from D:\Windows Kits\10\Include\10.0.19041.0\um\winbase.h:43:
1>In file included from D:\Windows Kits\10\Include\10.0.19041.0\um\fileapifromapp.h:20:
1>D:\Windows Kits\10\Include\10.0.19041.0\um\winbase.h(9118,11): error : unknown type name 'FILE_INFO_BY_HANDLE_CLASS'
1> _In_ FILE_INFO_BY_HANDLE_CLASS FileInformationClass,
^
我用谷歌搜索这个符号并在
minwinbase.h
中找到它:
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
typedef enum _FILE_INFO_BY_HANDLE_CLASS {
FileBasicInfo,
FileStandardInfo,
FileNameInfo,
FileRenameInfo,
FileDispositionInfo,
FileAllocationInfo,
FileEndOfFileInfo,
FileStreamInfo,
FileCompressionInfo,
FileAttributeTagInfo,
FileIdBothDirectoryInfo,
FileIdBothDirectoryRestartInfo,
FileIoPriorityHintInfo,
FileRemoteProtocolInfo,
FileFullDirectoryInfo,
FileFullDirectoryRestartInfo,
#if (NTDDI_VERSION >= NTDDI_WIN8)
FileStorageInfo,
FileAlignmentInfo,
FileIdInfo,
FileIdExtdDirectoryInfo,
FileIdExtdDirectoryRestartInfo,
#endif
#if (NTDDI_VERSION >= NTDDI_WIN10_RS1)
FileDispositionInfoEx,
FileRenameInfoEx,
#endif
#if (NTDDI_VERSION >= NTDDI_WIN10_19H1)
FileCaseSensitiveInfo,
FileNormalizedNameInfo,
#endif
MaximumFileInfoByHandleClass
} FILE_INFO_BY_HANDLE_CLASS, *PFILE_INFO_BY_HANDLE_CLASS;
#endif
我猜是版本宏问题导致这个枚举不包含在内。 所以我创建了另一个项目来打印
NTDDI_VERSION
,但它返回 0xa0000008
,它比上面出现的所有宏都大。
然后我尝试将这些宏注释掉,它可以工作,而不是继续编译其他文件,并遇到一些新错误。
但看来这只是一个临时补丁,而不是根本原因,新的错误似乎也与此有关:
1>../../../src/base/debug/stack_trace_win.cc(173,12): error : use of undeclared identifier 'RtlCaptureStackBackTrace'
1> count_ = CaptureStackBackTrace(0, arraysize(trace_), trace_, nullptr);
1> ^
1>D:\Windows Kits\10\Include\10.0.19041.0\um\winbase.h(118,31): note: expanded from macro 'CaptureStackBackTrace'
1>#define CaptureStackBackTrace RtlCaptureStackBackTrace
1>../../../src/base/platform/platform-win32.cc(841,11): error : use of undeclared identifier 'IsWindows10OrGreater'
1> if (IsWindows10OrGreater())
我猜是某些构建工具配置不正确,但我不知道可能是什么。 有人有什么想法吗?
尝试安装 Windows sdk 版本 10.0.20348.0 或最新版本。
这不是一个理想的解决方案,但它满足了我的即时需求。
将 v8 回滚到版本
9.9.115.10
,d8 构建良好。
要回滚,
git checkout 7d7c04aac7d650964d96d1f1c080949ae5519c78
然后gclient sync
。
显然主分支目前已损坏。
搜索您的所有项目“_WIN32_WINNT”和“WINVER”。将值更改为 0x0A00 #define _WIN32_WINNT 0x0A00 // 目标 Windows 10 #定义WINVER 0x0A00
此变量是您要构建的 Windows 的目标版本。因为您使用的 Visual Studio 有新版本,但您的软件按照旧版本要求运行。所以你需要添加这个。然后编译器可以在 Visual Studio 中查找正确的库