VS2019最简单编译V8引擎方法

2023-10-26


本篇文章的方法在2021-3-31测试正常使用。

看到这篇文章的时候,如果你也向我一样曾经对编译v8感到迷茫,不知道怎么才能正确编译好的话,我希望这篇文章能够帮助你实现v8引擎编译并且使用。我研究了两天时间,终于成功编译了v8代码(WIN10环境),发现编译v8没有像网上说的那么困难(首先你需要一个网络代理),所以我决心想写一篇细致的文章解决目前大家编译中的问题,一些共犯的基础问题不再仔细阐述,重点写编译过程中的问题,如果你是在下载源码过程中遇到问题的话,一定要检查代理的问题。如果你是在linux等系统的话,建议仔细查看文档,文档里面linux介绍比win的要多。Linux系统编译成功的机会更大!所以如果实在没有办法,不妨在其他系统编译好之后复制到本系统使用。
我特地让一个朋友测试,在没有阅读其他文章的时候,仅仅阅读本篇文章再加上官方文档也能成功安装V8引擎。所以不一定把每篇文章都读,一定要找到重点来看。

如果你没有时间仔细阅读文章的话我把所有重点全部加粗的方式标注出来,方便快速读到重点。所谓重点其实就是你出错的原因,比如你gclient出错,那么就检查gclient之前的那一步,解决完再进行下面的一步。在执行最后一步之前,一定要保证前面的步骤全部正确。由于源码的head有用户电脑签名信息,所以不方便发布源码,大家还是自己动手gclient下载源码吧,看到这篇文章的人应该都是有一定技术的,下载源码这个是小事,之后如何编译,如何使用才是重点。

1.编译前的配置工作

1.1配置代理

管理员的身份运行控制台(win+r键 cmd),之后输入以下:

set HTTP_PROXY=http://127.0.0.1:8990
set HTTPS_PROXY=http://127.0.0.1:8990

其中的8990为你们自己设置的代理端口,有些程序默认为8080,视不同程序而定。只需要输入这两行代码就可以,用这种方式设置代理的话,重启控制台就会失效,需要重新设置。有了代理是之后的gclient得以正常运行的前提。

1.2下载depot tools

在下载工具之前首先要明确为何要下载这个工具?这个工具其实是便于下载谷歌源码的一个工具,直接使用git的方式也可以下载源码,但是下载v8源码不全,所以直接建议使用这个工具下载完整源码,而不需要使用git等方法下载部分残缺源码。 因为即使下载了源码也不全,后来还得继续下载完整版才行。
v8源码地址(只下载depot工具,不下载源码即可)
在这里插入图片描述
下载完之后设置环境变量,比如我把deptot放在了F:\depot下。设置环境变量只需要按照我这一个方式设置即可。
设置环境变量图
之后还需要设置一个环境变量,直接用控制台然后输入

DEPOT_TOOLS_WIN_TOOLCHAIN=0
#再输入一行代码 来检查depot
gclient

1.3下载Windows SDK10

直接在百度搜索windowskit10,然后安装,大概10分钟的时间。
1.3步做完之后,就可以开始下载v8全套源码了!

2.获取源码

比如我想安装到c盘的v8文件夹

#以下代码必须一行一行输入,不能直接全部复制
cd c:\v8
fetch v8

这两行代码就需要执行相当长的时间,如果你网速好的话可能20分钟可以下完,网速差的话可能长达几小时时间。中途要是网络中断的话输入gclient sync -v来重新下载代码。

当出现finished字样代表即将安装完成,我们再等待几分钟让源码完整安装完。之后就可以编译 了。

最终会有类似下图的结果,代表全部代码安装完。
目前来看,最新版代码安装好之后为2.48GB。建议直接使用最新版源码。
在这里插入图片描述

2.1可能出现的错误

下图表示代理设置失败,检查第一步中的代理设置。
在这里插入图片描述

3.编译源码

3.1 VS2019编译(1)

在编译之前,首先要做的是把全部代码备份。因为可能会遇到奇怪的错误,备份代码以防万一。
使用VS2019的控制台(而不是默认的控制台)输入以下代码(特别注意其中的\转义字符,十分重要):

gn gen out.gn\x64.release_vs --sln=v8 --ide=vs2019 --args="is_debug=false target_cpu=\ “x64\ " is_component_build=true v8_static_library=false use_custom_libcxx=false use_custom_libcxx_for_host=false v8_use_external_startup_data=false is_clang=false v8_use_external_startup_data=false”

gn gen out.gn\x64.release_vs --sln=v8 --ide=vs2019 --args="is_debug=false target_cpu=\"x64\" is_component_build=true v8_static_library=false use_custom_libcxx=false use_custom_libcxx_for_host=false v8_use_external_startup_data=false is_clang=false v8_use_external_startup_data=false"

然后打开VS2019,直接BUILD gn_all这个项目(注意不是全部项目,只编译154个项目中的这个项目)
但是即使是这个项目也要花费相当长的时间编译

下图证明我是实际经过编译写的文章,这一步骤需要花费的时间更长。然而我在使用这个编译的时候仍然报错了。
在这里插入图片描述

3.2 VS2019编译(2)

在VS2019的控制台输入以下代码gn gen --ide=vs out.gn\x64_solution
然后编译gn_all

我推荐使用这个方法,这个方法最简单,第一个方法相当于加上了参数,这里相当于把参数设置为默认,还是推荐在X64环境下编译,如果你是64位 系统的话推荐在64位环境编译。

这里要注意到,如果你输入gn …等等代码的时候,提示找不到gn.exe,说明在获取源码出现问题,首先要做的是重新输入gclient sync -v重新获取源码,如果不行的话重新fetch v8!获得源码。以上的gn~命令必须正确运行才能使用VS2019进行编译。
由于方法2和方法1几乎是同一个方法,所以如果报错的话报错的原因也基本类似。

3.3另外一种编译的方式

这个方式需要python老版本的支持。我还是推荐使用VS2019编译,能用新版本就用新版本。软件更新换代的时候要紧跟时代潮流。

python tools\dev\v8gen.py x64.release
ninja -C out.gn\x64.release

最终编译后生成很多文件,有dll,有lib,其中关键的是v8.dll和v8.dll.lib文件生成。但是这种方法使用到了v8gen.py,而这个文件的函数容易出现错误。

3.4直接编译方法(独创)★★

本人由于其他原因在VS编译报错,网上探究了很长时间,最终发现了一个目前最好的编译方法(其实官方文档有写,但是比较隐晦,导致国内很多人不知道这个方法)。特别奇怪的是网上很多教程都是打开VS2019的,其实不用打开就能编译,调用Ninja即可。此方法为网上独创方法,其他博客写的方法虽有类似,但是执行过程中仍然会有困难,本人终于使用这个方法成功编译出了v8.dll
直接在VS的控制台(注意不是系统自带的控制台)输入gn args out/x64.debug
之后会弹出一个记事本文件。输入以下内容

    is_debug=true 
    target_cpu="x64"
    v8_enable_i18n_support=false 
    v8_use_external_startup_data=false 
    #use_custom_libcxx​=false 
    is_component_build=true

紧接着直接使用ninja -C out/x64.debug v8
就可以编译了(一定要注意执行过程中是否有出错,一般debug出错的概率更低一些)!如下图所示,能够成功编译
在这里插入图片描述
最终编译效果图(供参考,实际不一定一致)
在这里插入图片描述

4.补充代码

4.1补充代码(1)

这一模块所列代码有些包含了之前的代码,有些是经常在控制台需要反复输入的代码,有些是额外辅助代码。如果你之前步骤都没有错误到第三步已经可以使用了。第四步的代码是额外辅助用的。我把补充的代码也贴在这里,方便大家查询,同时自己也相当于做一个备份。

#如果你想换老版本的话使用
#必须进入到完整v8代码目录下输入git checkout才有效果
git checkout 4.5.103.35
#设置代理(可选代码)
git config --global http.proxy http://127.0.0.1:8990
git config --global https.proxy http://127.0.0.1:8990
netsh winhttp set proxy 127.0.0.1:8990
set HTTP_PROXY=http://127.0.0.1:8990
set HTTPS_PROXY=http://127.0.0.1:8990
#清除代理(可选代码)
git config --global --unset http.proxy
git config --global --unset https.proxy
netsh winhttp reset proxy
set HTTP_PROXY=
set HTTPS_PROXY=
#控制台设置变量
SET DEPOT_TOOLS_WIN_TOOLCHAIN=0
#开始下载
fetch v8
#下面是切换版本 如果不切换版本就是最新版
cd v8
git checkout 8.8-lkgr
gclient sync -v
#编译1
gn gen --ide=vs out.gn\x64_solution
#编译2
gn gen out.gn\x64.release_vs --sln=v8 --ide=vs2019 --args="is_debug=false target_cpu=\"x64\" is_component_build=true v8_static_library=false use_custom_libcxx=false use_custom_libcxx_for_host=false v8_use_external_startup_data=false is_clang=false v8_use_external_startup_data=false"

4.2补充代码(2)

#### fetch
cd v8-
git checkout branch-heads/8.3 #(失效)
git pull branch-heads/8.3 #(失效)
gclient sync -D
#### debug
   gn args out/x64.debug 
 
    is_debug=true 
    target_cpu="x64"
    v8_enable_i18n_support=false 
    v8_use_external_startup_data=false 
    #use_custom_libcxx​=false 
    is_component_build=true

   ninja -C out/x64.debug v8
#### clean
   ninja -C out/x64.debug -t clean
 
#### release
gn args out/x64.release
       is_debug=false
       target_cpu="x64"
       v8_enable_i18n_support=false 
       v8_use_external_startup_data=false 
       use_custom_libcxx=false 
       is_component_build=true
 
 ninja -C out/x64.release v8
#### clean
    ninja -C out/x64.release -t clean

5.使用V8引擎

直接把代码复制进去,然后需要注意的是,包含目录、附加库目录、附加依赖项三个。具体一些:
A、添加工程的头文件目录:工程—属性—配置属性—C/C+±–常规—附加包含目录:加上头文件存放目录。
B、添加文件引用的lib静态库路径:工程—属性—配置属性—链接器—常规—附加库目录:加上lib文件存放目录。
C 然后添加工程引用的lib文件名:工程—属性—配置属性—链接器—输入—附加依赖项:加上lib文件名

// Copyright 2012 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
//       copyright notice, this list of conditions and the following
//       disclaimer in the documentation and/or other materials provided
//       with the distribution.
//     * Neither the name of Google Inc. nor the names of its
//       contributors may be used to endorse or promote products derived
//       from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include <v8.h>

#include <libplatform/libplatform.h>

#include <assert.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
 * This sample program shows how to implement a simple javascript shell
 * based on V8.  This includes initializing V8 with command line options,
 * creating global functions, compiling and executing strings.
 *
 * For a more sophisticated shell, consider using the debug shell D8.
 */


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();
    //std::unique_ptr<v8::Platform> platform;
    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::NewFromUtf8Literal(isolate, "'Hello' + ', World!'");

            // 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);
        }

        {
            // Use the JavaScript API to generate a WebAssembly module.
            //
            // |bytes| contains the binary format for the following module:
            //
            //     (func (export "add") (param i32 i32) (result i32)
            //       get_local 0
            //       get_local 1
            //       i32.add)
            //
            const char csource[] = R"(
        let bytes = new Uint8Array([
          0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x07, 0x01,
          0x60, 0x02, 0x7f, 0x7f, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x07,
          0x07, 0x01, 0x03, 0x61, 0x64, 0x64, 0x00, 0x00, 0x0a, 0x09, 0x01,
          0x07, 0x00, 0x20, 0x00, 0x20, 0x01, 0x6a, 0x0b
        ]);
        let module = new WebAssembly.Module(bytes);
        let instance = new WebAssembly.Instance(module);
        instance.exports.add(3, 4);
      )";

            // Create a string containing the JavaScript source code.
            v8::Local<v8::String> source =
                v8::String::NewFromUtf8Literal(isolate, csource);

            // 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 a uint32 and print it.
            uint32_t number = result->Uint32Value(context).ToChecked();
            printf("3 + 4 = %u\n", number);
        }
    }

    // Dispose the isolate and tear down V8.
    isolate->Dispose();
    v8::V8::Dispose();
    v8::V8::ShutdownPlatform();
    delete create_params.array_buffer_allocator;
    return 0;
}

6.心得总结

这个基本上是目前我调试环境变量最复杂的一个引擎(主要是方法不对绕弯路),但我还是希望用简单的方式来指导更多人学会使用这个引擎,v8真的很强大,仔细阅读源码也能收获很多(代码写的相当规范,几百人Google团队开发10年代码不是随便的人就能实现的)
但是使用v8比编译的难度更大,国内几乎没多少人在用,讨论交流比较困难,要想学习还需要多多涉猎,特别是一些底层的知识原理。
另外,本人是直接使用的最新版本进行编译的,但是这样做其实不好,最新版本bug可能比较多(Google更新速度太快,真的有可能出BUG),不妨换版本,换成低版本的方法,说不定你在低版本就可以使用了。

git checkout 8.4-lkgr
gclient sync -D

其中的-D命令为删除多余文件,释放空间用。
PS:本篇文章持续更新,发现新问题新方法会补充在文章之中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS2019最简单编译V8引擎方法 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 在 Visual Studio 2008 上设置预调试事件

    我想在 Visual Studio 中开始调试程序之前运行一个任务 我每次调试程序时都需要运行此任务 因此构建后事件还不够好 我查看了设置的 调试 选项卡 但没有这样的选项 有什么办法可以做到这一点吗 你唯一可以尝试的 IMO 就是尝试Co
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • 如何衡量两个字符串之间的相似度? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给定两个字符串text1 and text2 public SOMEUSABLERETURNTYPE Compare string t
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 如何使我的表单标题栏遵循 Windows 深色主题?

    我已经下载了Windows 10更新包括黑暗主题 文件资源管理器等都是深色主题 但是当我创建自己的 C 表单应用程序时 标题栏是亮白色的 如何使我自己的桌面应用程序遵循我在 Windows 中设置的深色主题 你需要调用DwmSetWindo
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj

随机推荐

  • MFC控制IDC_STATIC的大小和颜色

    类向导添加消息WM CTLCOLOR得到函数 根据函数GetDlgCtrlID对指定的控件进行操作 HBRUSH CmySqlselectDlg OnCtlColor CDC pDC CWnd pWnd UINT nCtlColor HBR
  • datax同步mysql数据到hive

    datax hdfswriter文档 https github com alibaba DataX blob master hdfswriter doc hdfswriter md 需要注意的是 hdfswriter写入时的字段分隔符 需要
  • OOM-Java内存不足排查与分析

    一 背景 项目程序是内嵌到APP的H5页面 从APP跳转进入H5页面需要调用APP系统的token认证接口 近期某个时间点出现登录验证失败情况 排查服务日志 发现token认证接口服务报错 java lang OutOfMemoryErro
  • notepad++ 64位安装json插件JStool

    64bit的 notepad 不支持plugin manager了 只能手动安装插件 json格式化工具 JSTool http www softpedia com get Office tools Text editors Junwen
  • Unity基础篇:A game object can only be in one layer. The layer needs to be in the range [0...31]解决方案

    出现这个问题大多是因为你项目中用到的Layer参数没有在ProjectSetting里面设置 解决方案 然后把用到的Layer添加进去就OK了
  • 宝塔访问MySQL数据库 phpmyadmin 503 由于维护停机或容量问题,服务器暂时无法满足您的请求。Service Unavailable

    1 检查服务器端口是否已经开放 具体方法可参考 端口开放 https blog csdn net Anicer1219 article details 114373394 2 检查宝塔安全组是否放行端口 3 检查 phpmyadmin 工具
  • 代码随想录训练营第十一天

    1 有效的括号 LeetCode 题20 https programmercarl com 0020 E6 9C 89 E6 95 88 E7 9A 84 E6 8B AC E5 8F B7 html E8 BF 9B E5 85 A5 E
  • 李宏毅 机器学习 2016 秋:4、bias vs variance

    文章目录 四 Where does the error come from 四 Where does the error come from 我们上一次有看到说 如果你选择不同的 function set 你就是选择不同的 model 你在
  • CSS3-nth-child() 选择器的使用

    nth child n 选择属于其父元素的第 n 个子元素 n 可以是一个数字 一个关键字 或者一个公式 相对于父级做参考 选择所有子元素中匹配元素的奇数子元素 被选中的元素符合匹配条件且为奇数个的元素 dl box dd nth chil
  • c++之静态函数和静态方法

    1 对象与对象之间要共享数据 则需要使用静态成员或静态方法 2 在类中声明静态成员变量 即使不实例化对象 也可以我静态成员变量分配空间 因为静态成员变量在对象创建之前就已经被分配了内存空间 3 静态成员虽在类中 但它并不是随对象的建立而分配
  • [网络安全提高篇] 一一二.DataCon Coremail邮件安全竞赛之钓鱼邮件识别及分类

    这是作者2020年参加清华大学 Coremail 奇安信DataCon举办的比赛 主要是关于钓鱼和异常邮件识别研究 非常感谢举办方让我们学到了新知识 DataCon也是我比较喜欢和推荐的大数据安全比赛 这篇文章2020年10月就进了我的草稿
  • C#获取windows下用于标志当前电脑的唯一性编号

    最近做的项目 有个需求需要软件注册激活后才能使用 激活这种事情么 从来没做过 网上找找大多数说法都是绑定PC机器的物理硬件 推荐用SmBIOS的UUID 获取不到的情况下再用其它硬件序列号组合 但找了一圈没找到现成的C 代码获取相关ID的文
  • CSRF攻击与防御(写得非常好)

    转载地址 http www phpddt com reprint csrf html CSRF概念 CSRF跨站点请求伪造 Cross Site Request Forgery 跟XSS攻击一样 存在巨大的危害性 你可以这样来理解 攻击者盗
  • LR(1)分析法

    目录 1 LR 1 分析表和LR 1 文法 2 SLR冲突消解存在的问题 1 LR 1 和SLR 1 分析表构造方法的对比 2 SLR冲突消解存在的问题 3 LR K 项目 4 有效项目 5 构造LR 1 分析表的方法 6 例题分析 1 L
  • Python爱心程序(怦然心动)

    import random from math import sin cos pi log from tkinter import CANVAS WIDTH 640 画布的宽 CANVAS HEIGHT 640 画布的高 CANVAS CE
  • 硬件基础——数字电路门电路

    门电路与D触发器 一 与门 1 基本定义 与门又称 与电路 逻辑 积 逻辑 与 电路 是执行 与 运算的基本逻辑门电路 有多个输入端 一个输出端 当所有的输入同时为高电平 逻辑1 时 输出才为高电平 否则输出为低电平 逻辑0 2 真值表 3
  • 简述远程视频监控项目方案

    5G时代的到来和运营商不断的下调流量资费 使得远程视频监控系统更加的被广泛使用 视频监控中前端摄像机具有快速编码视频内容的能力视频图象数字化是实时编码压缩的 视频流被封装为编码成网络数字包 可以通过网络传输到后端的解码 存储设备 在局域网视
  • mysql float 1,MySql中float类型含义及参数详解

    float表示浮点数 通俗点来说的话 我们可以简单理解为小数 参数有两个 M表示精度 表示浮点数的位数 D表示标度 表示小数位数 M位数不包括小数点位数 举例 float 6 2 则最大范围表示 9999 99 9999 99 float所
  • 用python写一个解密JS混淆加密代码的代码。

    为了解密JS混淆加密代码 您可以使用以下Python代码 def deobfuscate obfuscated code 首先 使用JS解密器库 例如Javascript Deobfuscator 尝试解密代码 以下是使用Javascrip
  • VS2019最简单编译V8引擎方法

    文章目录 1 编译前的配置工作 1 1配置代理 1 2下载depot tools 1 3下载Windows SDK10 2 获取源码 2 1可能出现的错误 3 编译源码 3 1 VS2019编译 1 3 2 VS2019编译 2 3 3另外