lld-link:错误:<root>:未定义符号:mainCRTStartup构建V8时

时间:2019-03-03 08:13:52

标签: visual-studio-2017 v8 embedded-v8

我现在已经花了整整一整天的时间,似乎无法用VS 2017构建.lib文件。我在这里关注了V8文档:

https://v8.dev/docs/build

按照说明进行操作确实可以,但是我最终在out目录和.lib中使用了V8命令行程序,这些程序不适用于Visual Studio2017。

  

严重错误LNK1107:文件无效或损坏:无法从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.

我想我缺少了一些东西,但是我现在不知道。

1 个答案:

答案 0 :(得分:0)

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

我要做的另一件事是直接编辑args.gn文件并保存。正确的过程是运行gn args out.gn\x64.release,以便保存并关闭编辑器后,它会自动重新生成/更新文件。很有可能更改文件本身不会产生任何效果,并且您会感到困惑,因为ninja甚至看不到更改。

有关损坏的文件的链接器错误是因为默认情况下is_clang为true。设置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使其匹配。