在我正在工作的一个项目中,我们使用V8来执行javascript。有 v8lib_monolith.a 文件(表明 v8 引擎是预编译的)。在我用来构建项目的 cmakelists 中,我也将运行时与 v8 整体库链接起来。我还有一个围绕这个 v8 的包装器,我正在其中初始化 ICU。当我尝试使用利用 ICU 库的函数时,我仍然遇到错误。错误调用堆栈是:
stack: 'ReferenceError: Intl is not defined\n' + ' at getDateTimeFormat ([email protected]/plugin/timezone/index.js:24:5)\n' + ' at makeFormatParts ([email protected]/plugin/timezone/index.js:51:15)\n' + ' at tzOffset ([email protected]/plugin/timezone/index.js:56:24)\n' + ' at Function.d.tz ([email protected]/plugin/timezone/index.js:163:26)\n'
我想的一个可能的原因是如果我用
构建我的V8V8_ENABLE_I18N_SUPPORT=false
在 args.gn 文件中将使用
初始化 icuv8::V8::InitializeICUDefaultLocation(path to lib file)
启用 ICU 支持。
你实际上并没有问问题。想必您想知道如何获取
Intl
对象?
在您的
v8_enable_i18n_support = false
中使用 args.gn
,您不会得到 Intl
对象。因此,要么删除该参数(以使用默认值,即 true
),要么根据您的喜好将其显式设置为 true
。
除了启用 i18n 的编译时支持之外,您还需要初始化 ICU 数据文件的位置。
坦率地说,我不确定V8_ENABLE_I18N_SUPPORT=false
(大写拼写)的作用。基于您没有
Intl
对象的事实,我猜变量名称不区分大小写。为了让事情更清楚,为什么不按照官方的方式拼写它,即小写呢?