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引擎方法 的相关文章

  • 使用 Html Agility Pack 获取 html 页面上的所有 div id

    如何使用 Html Agility Pack 获取 html 页面上的所有 div id 我正在尝试获取所有 id 并将它们放入一个集合中 p p div class myclass1 div div div div div div div
  • Automapper、Mapper 未初始化。使用正确的配置调用初始化

    当我尝试将数据提交到数据库时 出现以下错误 Success false Error true ErrorType 2 Message System InvalidOperationException Mapper 未初始化 使用适当的配置调
  • 集群():是否可以仅检查文件是否已锁定,而不实际获取锁定(如果没有)?

    我的用例如下 我有一个程序 它强制在任何给定时间只能运行它的一个实例 因此在启动时它总是尝试在标准位置获取锁定文件 并在该文件终止时终止已经被锁定 这一切都工作正常 但现在我想用一个新的命令行选项来增强程序 当指定该选项时 将导致程序只打印
  • std::map find 在 C++ 中不起作用[重复]

    这个问题在这里已经有答案了 我使用以下几行创建了一个哈希映射和一个迭代器 std map
  • C++ STL 映射,std::pair 作为键

    这就是我通过地图定义的方式 std map
  • 地图类容器的专用功能

    我想要专门为矢量和地图之类的容器设计一个函数模板 对于向量 我可以像下面那样做 但我不知道如何才能有一个专门版本的函数 该函数仅用于像地图这样的容器 include
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 图片框、双击和单击事件

    我有一个奇怪的问题 我有一个图片框双击事件以及单击事件 问题是即使我双击该控件 也会引发单击事件 如果我禁用单击事件 则双击事件正在工作 这个问题已经在这里讨论过 https stackoverflow com questions 1830
  • MVC BaseController 处理 CRUD 操作

    我想重构我的基本 CRUD 操作 因为它们非常重复 但我不确定最好的方法 我的所有控制器都继承 BaseController 如下所示 public class BaseController
  • 如何在 Windows 上的 GCC 中链接 CS50 C 库

    我是 编程新手 一直在尝试使用以下命令编译我的代码MinGW https en wikipedia org wiki MinGW GCC 但我尝试包括CS50 https en wikipedia org wiki CS50 cs50 c
  • 为什么 xcode IDE 认为 `friend` 是保留字

    我一直在开发一个个人项目 并在我创建的新类中包含以下代码 property readonly getter isFriend BOOL friend 它似乎没有任何问题 当我构建它时 它可以编译得很好 但是当我们在xcode IDE看起来像
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 现代编译器的 C++ 中“memset”功能的状态

    Context 不久前 我偶然发现了 Alexandrescu 在 2001 年发表的 DDJ 文章 http www ddj com cpp 184403799 http www ddj com cpp 184403799 它是关于比较将
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • 对列表中的一系列整数求和

    假设我有一个这样的列表 List
  • 为什么 C# 中的命名空间允许循环依赖?

    在 c 中 您可以在文件 a cs 其命名空间为 MyApp A 中拥有一条语句 using MyApp B 而文件 b cs 其名称空间为 MyApp B 已经包含该语句 using MyApp A 如果类似的依赖关系存在于不同的 dll
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web

随机推荐

  • 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另外