Windows 编译CEF源码详细记录

news2024/12/23 11:24:53

背景

默认的CEF不支持音视频功能,需要下载源码将ffmpeg开关打开,再进行编译。

Linux编译参考:
《Linux CEF源码下载编译详细记录》

创建目录结构

code/
  automate/
    automate-git.py   <-- CEF build script
  chromium_git/
    cef/              <-- CEF source checkout
    chromium/
      src/            <-- Chromium source checkout
    update.[bat|sh]   <-- Bootstrap script for automate-git.py
  depot_tools/        <-- Chromium build tools

powershell中使用命令一键创建所需文件夹

mkdir -p CEF\automate,CEF\chromium_git

设置网络环境

可从clash猫 常规-端口那里打开已经设置好的代理的终端,或者手动设置终端代理

$env:HTTP_PROXY="http://127.0.0.1:7890"
$env:HTTPS_PROXY="http://127.0.0.1:7890"

查看代理

ls env:*|findstr proxy(PROXY)

PS E:\CEF\depot_tools> ls env:*|findstr proxy
https_proxy                    http://127.0.0.1:7890
http_proxy                     http://127.0.0.1:7890

设置git代理(可选),自测不需要。

git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

下载脚本

下载depot_tools

在CEF目录下,下载depot_tools

git clone https://chromium.googlesource.com/chromium/tools/depot_tools

depot_tools目录下执行update_depot_tools脚本,等待下载完成,这个阶段时间会有点长,会下载大约1GB的文件。

PS E:\CEF\depot_tools> .\update_depot_tools.bat

下载完成后,将其设置为环境变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T836StWD-1691654584186)(../AppData/Roaming/Typora/typora-user-images/image-20230802164755820.png)]

注意:这里环境变量位置似乎要在python、git之上。

不过我推荐临时设置环境变量的方式:

查看powershell环境变量

$env:path -split“;”

在powershell设置环境变量,这里是放在了所有Path环境变量的最前面

$env:Path="E:\CEF\depot_tools;$env:Path;"

cmd设置环境变量

set path=E:\CEF\depot_tools;%path%

查看环境变量:

set path

文档好多都是set命令,推荐使用cmd命令行。

下载automate-git.py

下载 automate-git.py 脚本到 CEF\automate\automate-git.py,可使用powershell命令下载,或者手动下载。

Start-BitsTransfer -Source "https://bitbucket.org/chromiumembedded/cef/raw/master/tools/automate/automate-git.py" -Destination "automate-git.py"

在chromium_git目录下创建update.bat脚本:

set GN_DEFINES=is_component_build=true
set GN_ARGUMENTS=--ide=vs2022 --sln=cef --filters=//cef/*
python ..\automate\automate-git.py --download-dir=c:\code\chromium_git --depot-tools-dir=c:\code\depot_tools --no-distrib --no-build
  • –branch 表示要下载哪个版本的代码,CEF 每个版本都有固定的分支,在 CEF 项目页查看分支名称指定即可。

  • –no-build 表示只下载代码而不编译,这里只为下载代码,我们还要修改支持多媒体的参数,所以不进行编译。

  • –no-distrib 不执行打包项目,这里只为下载代码,我们还要修改支持多媒体的参数,所以不进行打包。

  • –force-clean 如果你曾经执行过这个脚本,可能会出错,则加上这个参数,它执行清理残留文件(你也可以手动在 chromium 源码目录执行 git clean -xdf 来清理目录中的多余内容)。如果没有一次性下载成功而再次执行下载命令时,需要带上这个参数来清理一些信息,否则检出会失败

  • –force-clean-deps 编译老版本的时候会碰到下载第三方依赖库失败,碰到了可以加下这个

  • –no-depot-tools-update 如果工具包之前下载过了可以加上,就不升级工具包了,第一次下载不加

  • –no-update 编译时用,不更新直接编译

  • –no-debug-build 编译时用,不编译debug只要release

  • –x64-build 构建64位的版本

设置Boto代理(可选)

这一步可能有用

[Boto]
proxy = 127.0.0.1
proxy_port = 7890

创建boto.cfg文件,在命令行设置环境变量,set NO_AUTH_BOTO_CONFIG=E:\CEF\boto.cfg

执行脚本

运行update.bat:

PS E:\CEF\chromium_git> ./update.bat

E:\CEF\chromium_git>set GN_DEFINES=is_component_build=true

E:\CEF\chromium_git>set GN_ARGUMENTS=--ide=vs2022 --sln=cef --filters=//cef/*

E:\CEF\chromium_git>python ..\automate\automate-git.py --download-dir=E:\CEF\chromium_git --depot-tools-dir=E:\CEF\depot_tools --no-distrib --no-build
--> Download Directory: E:\CEF\chromium_git
--> Depot Tools Directory: E:\CEF\depot_tools
--> Updating depot_tools

等待。。。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7bJniKOQ-1691654584187)(../AppData/Roaming/Typora/typora-user-images/image-20230807210431222.png)]

但这里我老是卡在这个地方:

SyntaxError: unexpected EOF while parsing
Traceback (most recent call last):
  File "..\automate\automate-git.py", line 1232, in <module>
    run("gclient revert --nohooks", chromium_dir, depot_tools_dir)
  File "..\automate\automate-git.py", line 67, in run
    args, cwd=working_dir, env=env, shell=(sys.platform == 'win32'))
  File "E:\code\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python\bin\lib\subprocess.py", line 190, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['gclient', 'revert', '--nohooks']' returned non-zero exit status 1

我尝试了好几种:

  1. 将目录CEF改为code,与Wiki文档保持一致,失败
  2. 尝试修改update.bat,失败
  3. 尝试PowerShell换为cmd执行update.bat,失败

然后我换用VS的命令行工具x64 Native Tools Command Prompt for VS 2022执行,没想到成功了,能开始下载第三方库了

set http_proxy=http://127.0.0.1:7890 & set https_proxy=http://127.0.0.1:7890
update.bat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IDoIp3zc-1691654584188)(../AppData/Roaming/Typora/typora-user-images/image-20230808095743525.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7witlQu-1691654584188)(../AppData/Roaming/Typora/typora-user-images/image-20230808124425879.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bUsjAPo9-1691654584189)(../AppData/Roaming/Typora/typora-user-images/image-20230808124845010.png)]

下载成功!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CgXnaSuv-1691654584189)(../AppData/Roaming/Typora/typora-user-images/image-20230808134538909.png)]

问题处理

  • RPC failed; curl 92 HTTP/2 stream 3 was not closed cleanly before end of the underlying stream
1>________ running 'git -c core.deltaBaseCacheLimit=2g clone --no-checkout --progress https://chromium.googlesource.com/chromium/src.git E:\CEF\chromium_git\chromium\_gclient_src_uhqf8ic3' in 'E:\CEF\chromium_git\chromium' attempt 2 / 2
1>Cloning into 'E:\CEF\chromium_git\chromium\_gclient_src_uhqf8ic3'...
1>remote: Finding sources: 100% (1558/1558)           objects: 1
1>error: RPC failed; curl 92 HTTP/2 stream 3 was not closed cleanly before end of the underlying stream
1>error: 59273 bytes of body are still expected
1>fetch-pack: unexpected disconnect while reading sideband packet
1>fatal: early EOF
1>fatal: fetch-pack: invalid index-pack output

一般是下载超时

  • ‘gclient’, ‘revert’, ‘–nohooks’
src (ERROR)
----------------------------------------
[0:00:00] Started.
----------------------------------------
Traceback (most recent call last):
  File "E:\CEF\depot_tools\metrics.py", line 301, in print_notice_and_exit
    yield
  File "E:\CEF\depot_tools\gclient.py", line 3669, in <module>
    sys.exit(main(sys.argv[1:]))
  File "E:\CEF\depot_tools\gclient.py", line 3655, in main
    return dispatcher.execute(OptionParser(), argv)
  File "E:\CEF\depot_tools\subcommand.py", line 252, in execute
    return command(parser, args[1:])
  File "E:\CEF\depot_tools\gclient.py", line 3256, in CMDrevert
    return client.RunOnDeps('revert', args)
  File "E:\CEF\depot_tools\gclient.py", line 2129, in RunOnDeps
    work_queue.flush(revision_overrides,
  File "E:\CEF\depot_tools\gclient_utils.py", line 1016, in flush
    reraise(e[0], e[1], e[2])
  File "E:\CEF\depot_tools\gclient_utils.py", line 70, in reraise
    raise value
  File "E:\CEF\depot_tools\gclient_utils.py", line 1093, in run
    self.item.run(*self.args, **self.kwargs)
  File "E:\CEF\depot_tools\gclient.py", line 1161, in run
    self.ParseDepsFile()
  File "E:\CEF\depot_tools\gclient.py", line 888, in ParseDepsFile
    deps_to_add = self._deps_to_objects(
  File "E:\CEF\depot_tools\gclient.py", line 723, in _deps_to_objects
    cached_conditions[condition] = gclient_eval.EvaluateCondition(
  File "E:\CEF\depot_tools\gclient_eval.py", line 662, in EvaluateCondition
    return _convert(main_node)
  File "E:\CEF\depot_tools\gclient_eval.py", line 592, in _convert
    return EvaluateCondition(
  File "E:\CEF\depot_tools\gclient_eval.py", line 662, in EvaluateCondition
    return _convert(main_node)
  File "E:\CEF\depot_tools\gclient_eval.py", line 628, in _convert
    value = _convert(node.operand)
  File "E:\CEF\depot_tools\gclient_eval.py", line 620, in _convert
    bool_values.append(_convert(value))
  File "E:\CEF\depot_tools\gclient_eval.py", line 644, in _convert
    left = _convert(node.left)
  File "E:\CEF\depot_tools\gclient_eval.py", line 592, in _convert
    return EvaluateCondition(
  File "E:\CEF\depot_tools\gclient_eval.py", line 564, in EvaluateCondition
    main_node = ast.parse(condition, mode='eval')
  File "C:\Users\Listening\.vpython-root\store\cpython-e6tenrlsesftvg6k08ajgkk7b4\contents\bin\Lib\ast.py", line 47, in parse
    return compile(source, filename, mode, flags,
  File "<unknown>", line 0

    ^
SyntaxError: unexpected EOF while parsing
Traceback (most recent call last):
  File "E:\CEF\automate\automate-git.py", line 1232, in <module>
    run("gclient revert --nohooks", chromium_dir, depot_tools_dir)
  File "E:\CEF\automate\automate-git.py", line 66, in run
    return subprocess.check_call(
           ^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Listening\AppData\Local\Programs\Python\Python311\Lib\subprocess.py", line 413, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['gclient', 'revert', '--nohooks']' returned non-zero exit status 1.

此问题难以处理,只能多尝试几次,或者修改update.bat参数、换终端尝试。

修改ffmpeg配置文件

chromium_git\chromium\src\third_party\ffmpeg\chromium\config\Chromium\win-msvc\x64\config.h

chromium_git\chromium\src\third_party\ffmpeg\chromium\config\Chromium\win\x64\config_components.h

以防万一,这两个地方都将CONFIG_SIPR_PARSER 宏开关启用,改为1

执行cef脚本

chromium_git\chromium\src\cef\下创建脚本create.bat

set GN_DEFINES=ffmpeg_branding=Chrome proprietary_codecs=true is_official_build=true
set GN_ARGUMENTS=--ide=vs2022 --sln=cef --filters=//cef/*

call cef_create_projects.bat

这一行是为了激活ffmpeg

// 激活 ffmpeg 内部解码器
set GN_DEFINES=ffmpeg_branding=Chrome proprietary_codecs=true is_official_build=true

然后执行create.bat

遇到错误:

Exception: No supported Visual Studio can be found. Supported versions are: 17.0 (2022), 16.0 (2019), 15.0 (2017).
ERROR at //build/config/win/visual_studio_version.gni:28:7: Script returned non-zero exit code.
      exec_script("../../vs_toolchain.py", [ "get_toolchain_dir" ], "scope")
      ^----------
Current dir: E:/CEF/chromium_git/chromium/src/out/Debug_GN_x64/
Command: E:/CEF/depot_tools/bootstrap-2@3_8_10_chromium_26_bin/python3/bin/python3.exe E:/CEF/chromium_git/chromium/src/build/vs_toolchain.py get_toolchain_dir
Returned 1.
See //third_party/angle/gni/angle.gni:54:5: whence it was imported.
    import("//build/config/win/visual_studio_version.gni")
    ^----------------------------------------------------
See //ui/accessibility/BUILD.gn:16:3: whence it was imported.
  import("//build/toolchain/win/midl.gni")
  ^--------------------------------------
See //BUILD.gn:144:7: which caused the file to be included.
      "//ui/accessibility:accessibility_unittests",

因为我的 Microsoft Visual Studio 不是默认安装路径,我安装在D盘,修改create.bat脚本,加上

set GYP_MSVS_VERSION=2022
set GYP_MSVS_OVERRIDE_PATH=D:\Program Files\Microsoft Visual Studio\2022\Community
set WINDOWSSDKDIR=C:\Program Files (x86)\Windows Kits\10

即create.bat:

set GN_DEFINES=ffmpeg_branding=Chrome proprietary_codecs=true is_official_build=true

set GYP_MSVS_VERSION=2022
set GYP_MSVS_OVERRIDE_PATH=D:\Program Files\Microsoft Visual Studio\2022\Community
set WINDOWSSDKDIR=C:\Program Files (x86)\Windows Kits\10

set GN_ARGUMENTS=--ide=vs2022 --sln=cef --filters=//cef/*
call cef_create_projects.bat

然后就生成成功了,同时生成了Debug、Release的 x86、 x64版本,可以在chromium_git\chromium\src\out看到对应的产物

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZuN1ZZ0S-1691654584190)(../AppData/Roaming/Typora/typora-user-images/image-20230808154807626.png)]

问题处理

由于环境变量设置错误,导致开启音视频的环境变量被覆盖。所以我删掉out下的文件,重新编译了一次,结果这次,提示需要pgo_profiles文件,并且生成的文件夹多了后缀带_sandbox的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SbYwQFe-1691654584190)(../AppData/Roaming/Typora/typora-user-images/image-20230809144017271.png)]

如果遇到pgo_profiles的报错,可以按照提示进行修改

Generating CEF project files...
Generating Visual Studio projects took 2203ms
Done. Made 17846 targets from 3213 files in 12500ms
Applying issue #1999 fix to E:\CEF\chromium_git\chromium\src\out\Debug_GN_x64\obj\cef\libcef.ninja
Traceback (most recent call last):
  File "E:/CEF/chromium_git/chromium/src/tools/update_pgo_profiles.py", line 154, in <module>
    sys.exit(main())
  File "E:/CEF/chromium_git/chromium/src/tools/update_pgo_profiles.py", line 150, in main
    return args.func(args)
  File "E:/CEF/chromium_git/chromium/src/tools/update_pgo_profiles.py", line 106, in _get_profile_path
    raise RuntimeError(
RuntimeError: requested profile "E:\CEF\chromium_git\chromium\src\chrome\build\pgo_profiles\chrome-win32-5672-1683023364-7247966391e939f36249c5509b49406c09455a6d.profdata" doesn't exist, please make sure "checkout_pgo_profiles" is set to True in the "custom_vars" section of your .gclient file, e.g.:
solutions = [
  {
    "name": "src",
    # ...
    "custom_vars": {
      "checkout_pgo_profiles": True,
    },
  },
],
and then run "gclient runhooks" to download it. You can also simply disable the PGO optimizations by setting |chrome_pgo_phase = 0| in your GN arguments.
ERROR at //build/config/compiler/pgo/BUILD.gn:81:23: Script returned non-zero exit code.
      pgo_data_path = exec_script("//tools/update_pgo_profiles.py",
                      ^----------
Current dir: E:/CEF/chromium_git/chromium/src/out/Release_GN_x86/
Command: E:/CEF/depot_tools/bootstrap-2@3_8_10_chromium_26_bin/python3/bin/python3.exe E:/CEF/chromium_git/chromium/src/tools/update_pgo_profiles.py --target win32 get_profile_path
Returned 1.
See //build/config/BUILDCONFIG.gn:352:3: which caused the file to be included.
  "//build/config/compiler/pgo:default_pgo_flags",
  ^----------------------------------------------

我这里尝试运行gclient runhooks但是还是提示不存在,所以我这里将其禁用了,在create.bat的第一行追加chrome_pgo_phase = 0

set GN_DEFINES=ffmpeg_branding=Chrome proprietary_codecs=true is_official_build=true chrome_pgo_phase=0

编译

cd 到CEF/chromium_git/chromium/src路径下执行ninja命令

cd ~/CEF/chromium_git/chromium/src
ninja -C out/Release_GN_x64 cef

开始编译,我这里需要编译56602个文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oOcIzu2f-1691654584191)(../AppData/Roaming/Typora/typora-user-images/image-20230808155244690.png)]

然后再编译sandbox

ninja -C out/Release_GN_x64_sandbox cef_sandbox

问题处理

  1. UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x92 in position 231: illegal multibyte sequence

遇到这个错误好像不影响编译,最终也能编译成功。但不确定是否有缺陷。

[31649/56602] ACTION //chrome/browser/resources/settings:build_bundle(//build/toolchain/win:win_clang_x64)
Exception in thread Thread-2:
Traceback (most recent call last):
  File "E:\CEF\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python3\bin\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "E:\CEF\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python3\bin\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "E:\CEF\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python3\bin\lib\subprocess.py", line 1370, in _readerthread
    buffer.append(fh.read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0x92 in position 231: illegal multibyte sequence

来自网络解决方法:

Windows下默认是gbk,导致读取文件时出错,这里在cmd里改为UTF-8编码,设置全局环境UTF-8

set PYTHONLEGACYWINDOWSSTDIO=utf8
set PYTHONIOENCODING=utf8
set PYTHONUTF8=1

cmd终端编码修改为UTF-8,chcp会显示当前的编码编号

  • 936 GBK
  • 65001 UTF-8
chcp 65001

编译了X86的测试,发现没有报错了。

解决此问题时,最好清理一下

ninja -C out/Release_GN_x64 -t clean
  1. 第二次编译时,我提前设置了set PYTHONUTF8=1,结果又报这个UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd2 in position 706: invalid continuation byte错误,挺迷惑的,于是又改回来set PYTHONUTF8=0
FAILED: obj/sandbox/win/acls.stamp
E:/CEF/depot_tools/bootstrap-2@3_8_10_chromium_26_bin/python3/bin/python3.exe ../../build/win/set_appcontainer_acls.py --stamp=obj/sandbox/win/acls.stamp --dir=.
Traceback (most recent call last):
  File "../../build/win/set_appcontainer_acls.py", line 35, in <module>
    main()
  File "../../build/win/set_appcontainer_acls.py", line 29, in main
    common.set_lpac_acls(os.path.abspath(args.dir))
  File "E:\CEF\chromium_git\chromium\src\testing\scripts\common.py", line 72, in set_lpac_acls
    existing_acls = subprocess.check_output(['icacls', acl_dir],
  File "E:\CEF\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python3\bin\lib\subprocess.py", line 415, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "E:\CEF\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python3\bin\lib\subprocess.py", line 495, in run
    stdout, stderr = process.communicate(input, timeout=timeout)
  File "E:\CEF\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python3\bin\lib\subprocess.py", line 1015, in communicate
    stdout = self.stdout.read()
  File "E:\CEF\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python3\bin\lib\codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd2 in position 706: invalid continuation byte
[2139/57096] ACTION //net/base/registry_controlled_domains...ry_controlled_domains(//build/toolchain/win:win_clang_x64)
ninja: build stopped: subcommand failed.

打包cef

这里为了能打包standard版本的cef二进制分发包,所以我又编译了一次debug版本的。然后在\chromium_git\chromium\src\cef\tools路径下执行

make_distrib.bat --ninja-build --no-docs --x64-build --standard

  • –ninja-build:使用ninja构建
  • –no-docs:不创建文档
  • –x64-build:64位
  • –standard:标准发布包

不加--x64-build默认为x86版本

然后等待片刻就可以在chromium\src\cef\binary_distrib看到制作好的二进制分发包了

问题处理

  1. ERROR: Failed to find vcvars
ERROR: Failed to find vcvars
Traceback (most recent call last):
  File "E:\CEF\chromium_git\chromium\src\cef\tools\\make_distrib.py", line 949, in <module>
    os.path.join(dst_dir, 'cef_sandbox.lib'))
  File "E:\CEF\chromium_git\chromium\src\cef\tools\\make_distrib.py", line 404, in combine_libs
    run(cmdline, os.path.join(cef_dir, 'tools'))
  File "E:\CEF\chromium_git\chromium\src\cef\tools\\make_distrib.py", line 442, in run
    args, cwd=working_dir, env=os.environ, shell=(sys.platform == 'win32'))
  File "E:\CEF\depot_tools\bootstrap-2@3_8_10_chromium_26_bin\python\bin\lib\subprocess.py", line 190, in check_call
    raise CalledProcessError(retcode, cmd)

设置CEF_VCVARS环境变量

set CEF_VCVARS=D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vavars64.bat

同时修改chromium\src\cef\tools\msvs_env.bat文件,截至此文发布时间,这个bat脚本文件有bug,导致goto 跳转到found_vcvars失败,从而执行到echo ERROR: Failed to find vcvars导致错误,所以需要这里直接简单粗暴的在后面加上一行goto found_vcvars

:: Check if vcvars is already provided via the environment.
set vcvars="%CEF_VCVARS%"
if %vcvars% == "none" goto found_vcvars
if exist %vcvars% goto found_vcvars
goto found_vcvars

总结

晒个测试截图
在这里插入图片描述

在Windows上编译CEF源码,反而没有Linux上顺畅。

https://html5test.com/
https://zhuanlan.zhihu.com/p/133675543
记录一次项目中CEF版本的升级(二):CEF编译 - river12 - 博客园 (cnblogs.com)

https://www.moguf.com/post/wincefbuild

https://longxuan.ren/2021/07/24/CEF-Build-On-Windows/

https://www.magpcss.org/ceforum/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/860950.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue数组变更方法和替换方法

一、可以引起UI界面变化 Vue 将被侦听的数组的变更方法进行了包裹&#xff0c;所以它们也将会触发视图更新。这些被包裹过的方法包括&#xff1a; push()pop()shift()unshift()splice()sort()reverse() 以上七个数组都会改变原数组&#xff0c;下面来分别讲解它们的区别&…

《C和指针》(6)指针

1、内存和地址 计算机的内存是由数以亿万计的位&#xff08;bit&#xff09;组成&#xff0c;每一个位可以容纳值0、1值。由于一个位所能表示的值的范围太有限&#xff0c;所以单独的位用处不大。通常许多为合成一组作为一个单位&#xff0c;这样就可以存储范围较大的值。下图…

【AI】Python调用讯飞星火大模型接口,轻松实现文本生成

随着chatGPT的出现&#xff0c;通用大模型已经成为了研究的热点&#xff0c;由于众所周知的原因&#xff0c;亚太地区调用经常会被禁&#xff0c;在国内&#xff0c;讯飞星火大模型是一个非常优秀的中文预训练模型。本文将介绍如何使用Python调用讯飞星火大模型接口&#xff0c…

flask-----初始项目架构

1.初始的项目目录 -apps 包 ------存放app -user文件夹 -------就是一个app -models.py --------存放表模型 -views.py -------存放主代码 -ext包 -init.py -------实例化db对象 -manage.py -----运行项目的入口 -setting.py -----配置文件 2.各文件内容 manage…

剑指offer39.数组中出现次数超过一半的数字

这个题非常简单&#xff0c;解法有很多种&#xff0c;我用的是HashMap记录每个元素出现的次数&#xff0c;只要次数大于数组长度的一半就返回。下面是我的代码&#xff1a; class Solution {public int majorityElement(int[] nums) {int len nums.length/2;HashMap<Integ…

【C++】异常的使用和细节

传统C语言错误异常的方式 C语言一般使用assert来处理错误&#xff0c;assert确实很不错&#xff0c;可以把错误的行数都提示出来&#xff0c;但是&#xff0c;assert有一个致命的缺点&#xff0c;就是触发assert之后就会终止程序&#xff0c;还有一点就是在release环境下&#…

如何通过Pytest的插件,轻松切换自动化测试的环境地址?

前言 前面小编介绍了如何通过Pytest的插件来实现自动化测试的环境的切换&#xff0c;当时使用的方法是通过钩子函数进行获取命令行参数值&#xff0c;然后通过提前配置好的参数进行切换测试环境地址。加我VX&#xff1a;atstudy-js 回复“测试”&#xff0c;进入 自动化测试学…

【CDH集群】无法发出查询:Host Monitor未运行

无法发出查询:Host Monitor未运行 【CDH集群】无法发出查询:Host Monitor未运行同事的解决方案解决方法&#xff1a;删除原uuid重启agent查看新uuid修改scm数据库中HOSTS表中的agent的uuid 【CDH集群】无法发出查询:Host Monitor未运行 起初是impala报错&#xff0c;连接不上&…

武器换弹系统这节课出现的bug,角色不能正确掏枪了,只有换完弹夹以后才能正常掏枪了

UE4系列文章目录 文章目录 UE4系列文章目录前言一、蓝图实现二、错误原因三、修改后的效果 前言 在学习武器换弹系统这节课出现的bug&#xff0c;角色不能正确掏枪了&#xff0c;只有换完弹夹以后才能正常掏枪了&#xff0c;就是添加了换弹之后才影响了持枪功能&#xff0c;在…

Maven的入门级——介绍,安装,导入项目,全网最最详细教程!!,包含可能会包的错误的已经指出来了

目录 一.Maven的基本介绍 二. Maven的使用过程 使用步骤&#xff1a; 三.Maven的安装 3.1 下载 3.2 配置环境步骤 3.3配置settings.xml文件 四.入门案列 4.1 配置Eclipse环境 4.2 介绍Maven项目的结构 4.3 运行测试项目 一.Maven的基本介绍 我们可以知道在程序员做项目的时…

ngrok内网穿透可以实现资源共享吗?快解析更加简洁

随着互联网的高速发展&#xff0c;越来越多的人开始意识到内网穿透技术的重要性。在这一技术中&#xff0c;ngrok已经成为了一个备受关注的工具。然而&#xff0c;很多人对于ngrok是否可以进行资源共享存在疑问。本文将从新的角度出发&#xff0c;深入探讨这个问题。 了解什么…

SAP使用函数NUMBER_GET_NEXT创建流水号

1. 系统中设定流水号&#xff1b;使用T-Code&#xff1a;SNRO来创建一个流 输入Object&#xff1a;ZLC_001&#xff0c;然后单击创建。 然后输入Shorttext, Long text, Number length domain在写程序的时候应该会另外创建&#xff0c;这里测试就使用料号的Domain MATNR来做,其他…

Mahout教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Mahout 是 Apache Software Foundation&#xff08;ASF&#xff09; 旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout包含许多实现&#xff0c;包括聚类、分类、推荐…

利用PHP的特性做免杀Webshell

0x01 前言 最近很多家厂商都陆续开放了自己的Webshell检测引擎&#xff0c;并且公开接口&#xff0c;邀请众安全研究员参加尝试bypass检测引擎&#xff0c;并且给予奖励&#xff0c;我也参加了几场类似的活动&#xff0c;有 ASRC 的 伏魔计划 &#xff0c;也有 TSRC 的 猎刃计…

8月盛夏相约|上海国际智能家居展SSHT 精彩亮点抢先看

上海国际智能家居展览会&#xff08;SSHT&#xff09; 2023年8月29至31日 上海新国际博览中心举行 SSHT 作为国内专业智能家居展会&#xff0c;定位为“智能家居技术的行业平台”&#xff0c;以“技术整合”及“跨界合作”为主轴&#xff0c;旨在呈现不同层面的智能家居技术如…

计算机基础知识一

1、计算机系统组成 1.1 硬件 CPU&#xff1a;中央处理器、计算机核心部件、负责计算任务 内存&#xff1a;记忆功能、存储二进制数&#xff0c;内存是一个字节一个地址。 内存大小换算&#xff1a; 8 bits 1 Byte 1024 Bytes Bytes 1 KB &#xff0c; 1024 KB KB 1 …

妙盈面试(部分)

算法题1&#xff0c;二分查找即可&#xff1a; git rebase算法题2&#xff0c;求二叉树两结点的最小公共祖先 搞笑的是&#xff0c;第2道算法题我刚开始做&#xff0c;黑屏了两秒钟&#xff0c;当时其实腾讯会议软件已经崩溃了&#xff0c;但是我没注意到而是继续做题。等到做…

openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句

文章目录 openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句36.1 语法格式36.2 参数说明36.3 示例 openGauss学习笔记-36 openGauss 高级数据管理-TRUNCATE TABLE语句 清理表数据&#xff0c;TRUNCATE TABLE用于删除表的数据&#xff0c;但不删除表结构。也可以…

易大师运势测算网站源码含视频搭建教程

微信/支付宝支付、海外paypal支付、积分支付、VIP免支付&#xff0c;易支付&#xff0c;码支付。 对接真人服务、完善的分销功能、支持设置一二多级分成比例、微信/QQ登陆、注册送积分设置。 推广链接被访问送积分设置&#xff0c;海报推广功能、完善的推广机制&#xff0c;可…

MES系统应该涵盖那些功能

导 读 ( 文/ 1497 ) MES系统是专门面向生产环节的软件系统&#xff0c;用于管理、监控原材料转化为中间产品以及成品的过程。尽管市面上有着不同类别、覆盖不同行业的MES系统&#xff0c;但它们都具有一些基本特征&#xff0c;即包括产品文档管理、物料管理、生产执行管理…