lld-link: error: <root>: undefined symbol: mainCRTStartup when building V8
lld-link: error: <root>: undefined symbol: mainCRTStartup when building V8
我现在已经在这上面花了一整天,但我似乎无法获得 .lib
文件以使用 VS 2017 构建。我在这里遵循了 V8 文档:
按照说明进行操作确实有效,但我最终在 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.debug
和 ia32.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
以使其匹配。
我现在已经在这上面花了一整天,但我似乎无法获得 .lib
文件以使用 VS 2017 构建。我在这里遵循了 V8 文档:
按照说明进行操作确实有效,但我最终在 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.debug
和 ia32.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
以使其匹配。