lld-link: error: <root>: undefined symbol: mainCRTStartup when building V8

lld-link: error: <root>: undefined symbol: mainCRTStartup when building V8

我现在已经在这上面花了一整天,但我似乎无法获得 .lib 文件以使用 VS 2017 构建。我在这里遵循了 V8 文档:

https://v8.dev/docs/build

按照说明进行操作确实有效,但我最终在 out 目录和 .lib 中得到了一个 V8 命令行程序,它不适用于 Visual Studio 2017。

fatal error LNK1107: invalid or corrupt file: cannot read at 0x1422A

我执行此操作只是为了尝试获取库的构建文件:

gn gen out/lib --args="v8_static_library=true v8_use_snapshot=true v8_use_external_startup_data=false v8_monolithic=true icu_use_data_file=false is_component_build=false is_debug=false"

然后运行这个:ninja -C out/lib

这是最终结果:

ninja: Entering directory `out/lib'
[1632/1645] LINK cctest.exe cctest.exe.pdb
FAILED: cctest.exe cctest.exe.pdb
ninja -t msvc -e environment.x64 -- ../../../../third_party/llvm-build/Release+Asserts/bin/lld-link.exe /nologo /OUT:./cctest.exe /PDB:./cctest.exe.pdb @./cctest.exe.rsp
lld-link: error: <root>: undefined symbol: mainCRTStartup
[1634/1645] LINK generate-bytecode-expectations.exe generate-bytecode-expectations.exe.pdb
ninja: build stopped: subcommand failed.

我想我错过了什么,但我现在不知道。

好的,看来我的第一个错误是将提示更改为 v8\tools\dev\ 并从那里开始工作。我发现的 "normal" 步骤实际上只能从源代码的根目录正常工作。我以 v8\tools\dev\out\x64.release 结束,然后 ninja -C out/x64.release v8 失败,因为 v8 由于某种原因在此设置中未被接受。

我做错的另一件事是直接编辑args.gn文件并保存。正确的过程是 运行 gn args out.gn\x64.release 以便在您保存并关闭编辑器后,它会自动 re-generates/updates 文件。很可能更改文件本身没有任何影响,您会感到困惑,因为 ninja 甚至看不到更改。

有关损坏文件的链接器错误是因为 is_clang 默认为真。设置 is_clang=false 修复了该错误。它只是有效,我不知道为什么;拿走它就可以了……;)

从根本上对我有用的正确方法是:

python tools\dev\v8gen.py x64.release
python tools\dev\v8gen.py ia32.release
python tools\dev\v8gen.py x64.debug
python tools\dev\v8gen.py ia32.debug

这将输出可在"v8\out.gn"文件夹中编译的文件。

提示: 运行 "python tools\dev\v8gen.py list" 查看可能的构建配置列表。

接下来我更新了构建参数:

gn args out.gn\x64.release

使用这些:

 is_debug = false                      <-(or true for debug builds)
 target_cpu = "x64"
 is_component_build = false
 v8_static_library = true
 use_custom_libcxx = false
 use_custom_libcxx_for_host = false
 v8_use_external_startup_data = false  <-(or true to use the bin startup files)
 is_clang = false

对于 32 位版本(当然将上面的 "x64" 更改为 "x86"):

gn args out.gn\ia32.release

然后对 x64.debugia32.debug 重复上述所有操作。

并编译它们:

ninja -C out.gn/x64.debug v8
ninja -C out.gn/ia32.debug v8
ninja -C out.gn/x64.release v8
ninja -C out.gn/ia32.release v8

Visual Studio 2017 现在再次针对他们构建并链接我的项目(是我复活的旧项目)。

注意:链接 V8 库的调试版本可能会出现 _ITERATOR_DEBUG_LEVEL 不匹配的错误。为了解决这个问题,我只是转到 C++ 项目设置 (Confiuration Properties->C/C++->Preprocessor->Preprocesor Definitions) 并添加 ;_ITERATOR_DEBUG_LEVEL=0 以使其匹配。