V8 console.log 不打印
V8 console.log does not print
我正在尝试将 v8 嵌入到我的应用程序中,我很想看看 V8 环境中包含的内容(duktape 不包含控制台实现)并且看起来 v8 确实包含一个实现,但是当我调用 console.log
它不打印任何东西,而只是打印未定义的(我假设它是 console.log
的 return 值)那么如何链接默认的 std::cout
输出console.log
.
这是我目前的代码,我正在使用稍微修改过的默认 hello world 代码。
int main(int argc, char* argv[]) {
// Initialize V8.
v8::V8::InitializeICUDefaultLocation(argv[0]);
v8::V8::InitializeExternalStartupData(argv[0]);
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
v8::V8::InitializePlatform(platform.get());
v8::V8::Initialize();
// Create a new Isolate and make it the current one.
v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator =
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
v8::Isolate::Scope isolate_scope(isolate);
// Create a stack-allocated handle scope.
v8::HandleScope handle_scope(isolate);
// Create a new context.
v8::Local<v8::Context> context = v8::Context::New(isolate);
// Enter the context for compiling and running the hello world script.
v8::Context::Scope context_scope(context);
{
// Create a string containing the JavaScript source code.
v8::Local<v8::String> source =
v8::String::NewFromUtf8(isolate, R"(
console.log("does not print?")
)",
v8::NewStringType::kNormal)
.ToLocalChecked();
// Compile the source code.
v8::Local<v8::Script> script =
v8::Script::Compile(context, source).ToLocalChecked();
// Run the script to get the result.
v8::Local<v8::Value> result = script->Run(context).ToLocalChecked();
// Convert the result to an UTF8 string and print it.
v8::String::Utf8Value utf8(isolate, result);
printf("%s\n", *utf8);
}
}
// Dispose the isolate and tear down V8.
isolate->Dispose();
v8::V8::Dispose();
v8::V8::ShutdownPlatform();
delete create_params.array_buffer_allocator;
std::cin.get();
return 0;
}
我正在使用预构建的 v8 二进制文件 here
尝试以下操作:
#include "src/debug/interface-types.h"
- 定义您自己的 "console delegate" class,源自
debug::ConsoleDelegate
- 覆盖您感兴趣的任何方法,例如
void Log(const debug::ConsoleCallArguments& args, const v8::debug::ConsoleContext&) override;
- 实例化它并在创建您的
Isolate
后调用 debug::SetConsoleDelegate(isolate, &your_console_delegate);
要查看示例,请从 https://cs.chromium.org/chromium/src/v8/src/d8/d8-console.h?l=14&gsn=D8Console 开始并跟踪它的使用位置。
所以对于将来处理这个问题的任何人来说,这就是我用来修复它的过程。
- 从here下载源代码,只需要src文件夹。
- 将其提取并 link 到您的项目中,除了捆绑包 .
之外,您还可以将供应商代码
- 将它放在
src
文件夹中,否则它的包含不起作用
- 你需要制作一堆包含目录才能编译,我的包含
v8/src
和 v8
- 确保 link 使用 nuget 包,你可能不必这样做,一台机器需要它,另一台机器不需要。
- 您不需要生成
builtins-generated/bytecodes-builtins-list.h
我正在尝试将 v8 嵌入到我的应用程序中,我很想看看 V8 环境中包含的内容(duktape 不包含控制台实现)并且看起来 v8 确实包含一个实现,但是当我调用 console.log
它不打印任何东西,而只是打印未定义的(我假设它是 console.log
的 return 值)那么如何链接默认的 std::cout
输出console.log
.
这是我目前的代码,我正在使用稍微修改过的默认 hello world 代码。
int main(int argc, char* argv[]) {
// Initialize V8.
v8::V8::InitializeICUDefaultLocation(argv[0]);
v8::V8::InitializeExternalStartupData(argv[0]);
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
v8::V8::InitializePlatform(platform.get());
v8::V8::Initialize();
// Create a new Isolate and make it the current one.
v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator =
v8::ArrayBuffer::Allocator::NewDefaultAllocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
{
v8::Isolate::Scope isolate_scope(isolate);
// Create a stack-allocated handle scope.
v8::HandleScope handle_scope(isolate);
// Create a new context.
v8::Local<v8::Context> context = v8::Context::New(isolate);
// Enter the context for compiling and running the hello world script.
v8::Context::Scope context_scope(context);
{
// Create a string containing the JavaScript source code.
v8::Local<v8::String> source =
v8::String::NewFromUtf8(isolate, R"(
console.log("does not print?")
)",
v8::NewStringType::kNormal)
.ToLocalChecked();
// Compile the source code.
v8::Local<v8::Script> script =
v8::Script::Compile(context, source).ToLocalChecked();
// Run the script to get the result.
v8::Local<v8::Value> result = script->Run(context).ToLocalChecked();
// Convert the result to an UTF8 string and print it.
v8::String::Utf8Value utf8(isolate, result);
printf("%s\n", *utf8);
}
}
// Dispose the isolate and tear down V8.
isolate->Dispose();
v8::V8::Dispose();
v8::V8::ShutdownPlatform();
delete create_params.array_buffer_allocator;
std::cin.get();
return 0;
}
我正在使用预构建的 v8 二进制文件 here
尝试以下操作:
#include "src/debug/interface-types.h"
- 定义您自己的 "console delegate" class,源自
debug::ConsoleDelegate
- 覆盖您感兴趣的任何方法,例如
void Log(const debug::ConsoleCallArguments& args, const v8::debug::ConsoleContext&) override;
- 实例化它并在创建您的
Isolate
后调用
debug::SetConsoleDelegate(isolate, &your_console_delegate);
要查看示例,请从 https://cs.chromium.org/chromium/src/v8/src/d8/d8-console.h?l=14&gsn=D8Console 开始并跟踪它的使用位置。
所以对于将来处理这个问题的任何人来说,这就是我用来修复它的过程。
- 从here下载源代码,只需要src文件夹。
- 将其提取并 link 到您的项目中,除了捆绑包 . 之外,您还可以将供应商代码
- 将它放在
src
文件夹中,否则它的包含不起作用 - 你需要制作一堆包含目录才能编译,我的包含
v8/src
和v8
- 确保 link 使用 nuget 包,你可能不必这样做,一台机器需要它,另一台机器不需要。
- 您不需要生成
builtins-generated/bytecodes-builtins-list.h