Linking V8 to app on Windows

1,283 views
Skip to first unread message

Ivan P.

unread,
Nov 9, 2016, 2:42:19 AM11/9/16
to v8-users
Hello, I am porting my app from V8 3.19 to V8 5.3.332.45.
I have built new V8 version as DLL using Visual Studio 2013, updated code of my app to use updated APIs  and now trying to perform full build of my app.
My app doesn't use GN to build it, it is normal Visual Studio 2013 project. I have specified v8.dll.lib as additional linker input.

I get following linker error:
1>v8init.obj : error LNK2019: unresolved external symbol "class v8::Platform * __cdecl v8::platform::CreateDefaultPlatform(int)" (?CreateDefaultPlatform@platform@v8@@YAPEAVPlatform@2@H@Z) referenced in function .... "

I suppose v8::platform::CreateDefaultPlatform() must be present in libplatform, but because the error happens, I can make conclusion that libplatform it is not included into v8.dll.lib.
I have examined V8 build outputs and couldn't find libplatform as separate static lib or DLL: here is list of libs generated during the build, here is what I have:

icui18n.dll
icuuc.dll
msvcp120.dll
msvcp120d.dll
msvcr120.dll
msvcr120d.dll
pgort120.dll
v8.dll


cctest.lib
generate-bytecode-expectations.lib
icui18n.dll.lib
icuuc.dll.lib
mksnapshot.lib
unittests.lib
v8.dll.lib
v8_parser_shell.lib
v8_simple_json_fuzzer.lib
v8_simple_parser_fuzzer.lib
v8_simple_regexp_fuzzer.lib
v8_simple_wasm_asmjs_fuzzer.lib
v8_simple_wasm_fuzzer.lib

Please advise - either how to tune build to have libplatform generated as separate DLL or included to v8.dll ?
Or is it safe to make manually libplatform from obj files and link it, taking into account v8 is DLL?

Thanks.

George Marques

unread,
Nov 9, 2016, 12:36:51 PM11/9/16
to v8-users
I also had troubles with the build system. I found it's much easier to just use this Nuget package: https://github.com/pmed/v8-nuget.

Ivan Pizhenko

unread,
Nov 10, 2016, 9:05:30 AM11/10/16
to v8-u...@googlegroups.com
Thank you for advise, George, but what you suggest is not an option in the my case, I need to have built from sources exactly this stable version 5.3.332.45. There is no Nuget package fir exactly this version, and there are also other circumstances those prevent me using  Nuget package. So I am looking for exactly an explanation on how to solve this manually.

--
--
v8-users mailing list
v8-u...@googlegroups.com
http://groups.google.com/group/v8-users
---
You received this message because you are subscribed to a topic in the Google Groups "v8-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/v8-users/Y05xPj956Ys/unsubscribe.
To unsubscribe from this group and all its topics, send an email to v8-users+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Ivan Pizhenko

unread,
Nov 10, 2016, 10:37:22 AM11/10/16
to v8-u...@googlegroups.com
So I would like to hear comments on this from some V8 developer or whoever solved the issue w/o Nuget package.

Jochen Eisinger

unread,
Nov 10, 2016, 1:34:06 PM11/10/16
to v8-u...@googlegroups.com
on 5.3, it's not yet possible to build the libplatform as a shared library (dll), sorry. This is fixed in the current development branch.

also, by default we don't actually create static libraries, but gn just keeps track of the object files you need. You can change that by manually replacing source_set with static_library in the v8_source_set template in gni/v8.gni

hth
-jochen

To unsubscribe from this group and all its topics, send an email to v8-users+u...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to the Google Groups "v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+u...@googlegroups.com.

Ivan Pizhenko

unread,
Nov 15, 2016, 5:01:35 PM11/15/16
to v8-u...@googlegroups.com
Thaks, I will try this workaround, but also please tell me, what exactly do you mean by current development branch? Which version of V8 does it corresponds? 5.5?  5.6?

To unsubscribe from this group and all its topics, send an email to v8-users+unsubscribe@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to the Google Groups "v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscribe@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to a topic in the Google Groups "v8-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/v8-users/Y05xPj956Ys/unsubscribe.
To unsubscribe from this group and all its topics, send an email to v8-users+unsubscribe@googlegroups.com.

Ivan Pizhenko

unread,
Nov 16, 2016, 11:45:49 AM11/16/16
to v8-u...@googlegroups.com
Edited gni/v8.gni as you recommended and trying to build with following args.gn:

is_component_build = false
is_debug = true
v8_optimized_debug=false
target_cpu="x64"
v8_target_cpu="x64"

and getting following error:

ninja -j1 -C out.gn/x64.debug
ninja: Entering directory `out.gn/x64.debug'
[1/287] LINK v8_simple_json_fuzzer.exe
FAILED: v8_simple_json_fuzzer.exe
L:/depot_tools/python276_bin/python.exe gyp-win-tool link-wrapper environment.x64 False link.exe /nologo /OUT:v8_simple_
json_fuzzer.exe /PDB:v8_simple_json_fuzzer.exe.pdb @v8_simple_json_fuzzer.exe.rsp
LINK : warning LNK4044: unrecognized option '/fastfail'; ignored
LINK : error LNK2001: unresolved external symbol mainCRTStartup
v8_simple_json_fuzzer.exe : fatal error LNK1120: 1 unresolved externals

what I am doing wrong? please advice.

Ivan Pizhenko

unread,
Nov 16, 2016, 11:47:31 AM11/16/16
to v8-u...@googlegroups.com
Content of RSP file

obj/build/win/default_exe_manifest/default_exe_manifest.manifest.res
obj/json_fuzzer.lib
obj/simple_fuzzer.lib
obj/fuzzer_support.lib
obj/v8_libplatform.lib
obj/v8_libbase.lib
obj/v8_external_snapshot.lib
obj/v8_base.lib
obj/v8_libsampler.lib
obj/third_party/icu/icui18n.lib
obj/third_party/icu/icuuc.lib advapi32.lib comdlg32.lib dbghelp.lib delayimp.lib dnsapi.lib gdi32.lib kernel32.lib msimg32.lib odbc32.lib odbccp32.lib ole32.lib oleaut32.lib psapi.lib shell32.lib shlwapi.lib user32.lib usp10.lib uuid.lib version.lib wininet.lib winmm.lib winspool.lib ws2_32.lib  /DEBUG /MACHINE:X64 /FIXED:NO /ignore:4199 /ignore:4221 /NXCOMPAT /maxilksize:0x7ff00000 /fastfail /DYNAMICBASE:NO /INCREMENTAL /SUBSYSTEM:CONSOLE,5.02 /STACK:2097152 /LIBPATH:"C:/Program Files (x86)/Windows Kits/10/Lib/winv6.3/um/x64" /LIBPATH:"C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/lib/amd64" /LIBPATH:"C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/atlmfc/lib/amd64"

Ivan Pizhenko

unread,
Nov 17, 2016, 7:24:49 PM11/17/16
to v8-u...@googlegroups.com
Found workaround, but still have problem!
Workaround: building as ninja -j1 -C out.gn/optdebug.x64 d8
This seems to build everything necessary.
Then added following libs to linker options:
icui18n.lib
icuuc.lib
v8_base.lib
v8_external_snapshot.lib
v8_libbase.lib
v8_libplatform.lib
v8_libsampler.lib

So building now as static lib, but still have issue:

Many errors like this (pasting here one instance of each):

1>v8_base.lib(api.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in application.obj

1>v8_base.lib(preparser.obj) : error LNK2001: unresolved external symbol "void (__cdecl* std::_Raise_handler)(class stdext::exception const &)" (?_Raise_handler@std@@3P6AXAEBVexception@stdext@@@ZEA)

1>icuuc.lib(messagepattern.obj) : error LNK2005: "public: __cdecl std::_Container_base12::_Container_base12(void)" (??0_Container_base12@std@@QEAA@XZ) already defined in msvcprtd.lib(MSVCP120D.dll)

1>v8_base.lib(type-hint-analyzer.obj) : error LNK2001: unresolved external symbol "__int64 const std::_BADOFF" (?_BADOFF@std@@3_JB)

1>v8_base.lib(bytecode-peephole-optimizer.obj) : error LNK2001: unresolved external symbol "private: static int std::locale::id::_Id_cnt" (?_Id_cnt@id@locale@std@@0HA)

1>v8_base.lib(bytecode-array-builder.obj) : error LNK2001: unresolved external symbol "public: static class std::locale::id std::ctype<char>::id" (?id@?$ctype@D@std@@2V0locale@2@A)

1>v8_base.lib(simplified-lowering.obj) : error LNK2001: unresolved external symbol _Nan

My app in the configuration I am building (sort of "Debug") is linking to dynamic debug CRT, and I am generally expect that V8 built statically will be linking to that too, but seems like this is not the case.
Please advise, what to change  else in the GN configs to get it working? 

Ivan Pizhenko

unread,
Nov 18, 2016, 12:22:55 PM11/18/16
to v8-u...@googlegroups.com
Found solution. So just if someone needs- 
1. update v8/gni/v8.gni, put static library 
template("v8_source_set") {
  static_library(target_name) {
2. generate build files with gn
3. Run ninja -j1 -C yourbuilddir d8
Build only d8 - this will build all necessary libs.  
Then pick yourbuilddir/obj/*.lib and following
yourbuilddir/icuuc.dll
yourbuilddir/icuuc.dll.lib
yourbuilddir/icuuc.dll.pdb
yourbuilddir/icui18n.dll
yourbuilddir/icui18n.dll.lib
yourbuilddir/icui18n.dll.pdb
yourbuilddir/icudtl.dat
Link with all libs from picked, except you need to select between v8_nosnaphshot.lib or v8_external_snapshot.lib depending on what you need.
Hoping that this will be helpful for someone else.

DánielN

unread,
Mar 1, 2017, 1:16:49 PM3/1/17
to v8-users
I would like to add some more information to this topic. It could be useful to someone later. The previous version of V8 I am using is about a year old now and I would like to debug javascript in the embedded vm that is why I need the latest version.
I struggled a lot to make it work. I did not managed to create the necessary static libs. First I linked the obj files. It was a working but ugly solution. Then I found this topic that led me to the "proper" solution.

I had to have the static libs with statically linked runtime.

Here are the steps that worked for me:

download and unzip https://storage.googleapis.com/chrome-infra/depot_tools.zip to a folder (e.g. d:\Dev\v8-3\depot_tools)
prepend (not append!) depot_tools to PATH:> path=d:\Dev\v8-3\depot_tools;%PATH%
> gclient
> set DEPOT_TOOLS_WIN_TOOLCHAIN=0
> fetch v8
> cd v8
(if the next step does not work reinstall Win SDK 10 (maybe just the debugging tools from it suffices))
> gn gen --args="is_debug=false is_component_build=false v8_use_snapshot=true v8_use_external_startup_data=false v8_static_library=true" --ide=vs out\Default
> call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
> msbuild out\Default\all.sln /nologo /t:Build /p:Configuration=GN,Platform=x64 /v:normal

Three things to highlight
1. The "shard" feature seems to have disappeared. The v8_base.lib is 0.4G in release.
2. v8_libsampler.lib, DbgHelp.lib and Shlwapi.lib should probably be linked to the project to avoid unresolved external references
3. I had to change BUILD.gn to sort out several project failures caused by the referenced but not created wasm_test_signatures.lib:
v8_source_set("wasm_test_signatures") {
  sources
= [
   
"test/common/wasm/test-signatures.cc", #this is new
   
"test/common/wasm/test-signatures.h",
 
]
  configs
= [
   
":external_config",
   
":internal_config_base",
 
]
}

I also added a new file "test/common/wasm/test-signatures.cc". This file is only one line, it includes test/common/wasm/test-signatures.h.
After these changes gn gen generated the correct project file (wasm_test_signatures.vcxproj) that created the missing wasm_test_signatures.lib. (Interestingly "msbuild out\Default2\obj\wasm_test_signatures.vcxproj  /nologo /t:Build /p:Configuration=GN,Platform=x64 /v:normal" did not fail but it did not create the lib, either)

And finally this is how I link V8 to my project on Windows:
#if defined(_WIN32)
#    //define V8_SHARD
#    define V8_SNAPSHOT
#    //define V8_EXTERNAL_SNAPSHOT
#    if defined(V8_SHARD)
#        pragma comment(lib, "v8_base_0.lib")
#        pragma comment(lib, "v8_base_1.lib")
#        pragma comment(lib, "v8_base_2.lib")
#        pragma comment(lib, "v8_base_3.lib")
#    else
#        pragma comment(lib, "v8_base.lib")
#    endif    //V8_SHARD
#    pragma comment(lib, "v8_libbase.lib")
#    pragma comment(lib, "v8_libplatform.lib")
#    pragma comment(lib, "v8_libsampler.lib")
#    pragma comment(lib, "icui18n.lib")
#    pragma comment(lib, "icuuc.lib")
#    pragma comment(lib, "winmm.lib")
#    pragma comment(lib, "DbgHelp.lib")
#    pragma comment(lib, "Shlwapi.lib")
#    if defined(V8_SNAPSHOT)
#        if defined(V8_EXTERNAL_SNAPSHOT)
#            pragma comment(lib, "v8_external_snapshot.lib")
#        else
#            pragma comment(lib, "v8_snapshot.lib")
#        endif
#    else
#             pragma comment(lib, "v8_nosnapshot.lib")
#    endif    //V8_SNAPSHOT
#endif    //_WIN32


This is a the version I built: bfa425cc0841f17294e933e8d3611aad42deb2ee (Tue Feb 28 07:31:08 2017 -0800)

The problem with wasm_test_signatures.lib seems to be a bug. Could someone please confirm and fix it?

Is there a document that describes how to link V8 to projects? It can be quite a daunting job to upgrade it from an older version.
To unsubscribe from this group and all its topics, send an email to v8-users+u...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.
You received this message because you are subscribed to the Google Groups "v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+u...@googlegroups.com.

For more options, visit https://groups.google.com/d/optout.

--
--
v8-users mailing list
v8-u...@googlegroups.com
http://groups.google.com/group/v8-users
---
You received this message because you are subscribed to a topic in the Google Groups "v8-users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/v8-users/Y05xPj956Ys/unsubscribe.
To unsubscribe from this group and all its topics, send an email to v8-users+u...@googlegroups.com.

DánielN

unread,
Apr 10, 2017, 8:22:43 AM4/10/17
to v8-users
Reply all
Reply to author
Forward
0 new messages