百篇博客系列篇.本篇为:

v61.xx 鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 51.c.h.o

编译构建相关篇为:

ninja | 忍者

ninja是一个叫 Evan Martin的谷歌工程师开源的一个自定义的构建系统,最早是用于 chrome的构建,Martin给它取名 ninja(忍者)的原因是因为它strikes quickly(快速出击).这是忍者的特点,可惜Martin不了解中国文化,不然叫小李飞刀更合适些.究竟有多块呢? 用Martin自己的话说是当一个文件被修改后,ninja从发现到编译速度是make的十倍.有没有十倍不是本篇讨论的重点,人家做出来了,就算是牛皮也该人家吹.本篇是要对鸿蒙如何使用ninja做一个比较详细的阐述.

ninja是一个重视速度的构建系统,与其对标的是Make,它们都依赖于文件的时间戳进行检测重编.

  • 它的设计目的是让更高级别的构建系统生成其输入端文件,其并不希望你手动去编.ninja文件,可以生成.ninja的工具有gn,cmake,premake,甚至你自己都可以写个 ninja 生成工具.
  • ninja非常高效,可理解为构建系统中的汇编语言。
  • ninja文件没有分支、循环的流程控制,是被指定了一堆规则的文件,所以要比Makefile简单很多
  • 目前已知的GoogleChromeAndroid的一部分,LLVM, V8, 方舟编译器, 鸿蒙 等大型系统都使用到了ninja构建.

基本概念

  1. 概念 中译 解释
  2. edge build语句,指定目标(输出)、规则与输入,是编译过程拓扑图中的一条边(edge)。
  3. target 目标 编译过程需要产生的目标,由build语句指定。
  4. output 输出 build语句的前半段,是target的另一种称呼。
  5. input 输入 build语句的后半段,用来产生output的文件或目标,另一种称呼是依赖。
  6. rule 规则 通过指定command与一些内置变量,决定如何从输入产生输出。
  7. pool 一组ruleedge,通过指定其depth,可以控制并行上限。
  8. scope 作用域 变量的作用范围,有rulebuild语句的块级,也有文件级别。rule也有scope
  9. --------------------------------------------------------------------------------------------
  10. 关键字 作用
  11. build 定义一个edge
  12. rule 定义一个rule
  13. pool 定义一个pool
  14. default 指定默认的一个或多个target
  15. include 添加一个ninja文件到当前scope
  16. subninja 添加一个ninja文件,其scope与当前文件不同。
  17. phony 一个内置的特殊规则,指定非文件的target

简单的ninja

首先 ninja 一定是简单的,呆板的.凡是能被工具生成的东西,一定是在不断的重复某种简单,众多的简单按一定的规则有效叠加起来就能解决复杂的问题,请仔细想想是不是这个道理.ninja简单到没什么语法,只是几个概念和规则. 以至于 ninja参考手册gn参考手册 简单的太多.

看个示例:

  1. cflags = -Wall -Werror #全局变量
  2. rule cc
  3. command = gcc $cflags -c $in -o $out
  4. build foo.o: cc foo.c
  5. build special.o: cc special.c
  6. cflags = -Wall #局部变量,范围只在编译special.c上有效

解读

  • cflags:定义一个用户变量,用于给规则传参.
  • rule:定义一个叫cc的规则.
    • command:将生成bash命令,接收外部三个参数
  • 第一个build,将foo.ccc规则编译成foo.o
    • 最终编译选项:gcc -Wall -Werror -c foo.c -o foo.o
  • 第二个build,将special.ccc规则编译成special.o
    • 最终编译选项:gcc -Wall -c foo.c -o foo.o
  • in,outninja的两个内置变量.

phony规则

跟称呼弗拉基米尔·弗拉基米罗维奇·普京普总一样,

有些文件路径会很长,ninja提供取别名的功能,这仅仅是为了方便.

  1. build ability: phony ./libability.so
  2. build ability_notes: phony obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/ability_notes.stamp
  3. build ability_test: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/ability_test.stamp
  4. build ability_test_pageAbilityTest_group_lv0: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/test_lv0/page_ability_test/ability_test_pageAbilityTest_group_lv0.stamp

有了上面的铺垫,读懂鸿蒙的ninja部分应该没多大障碍了.

鸿蒙 | ninja

v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 篇的末尾已说明通过 gn gen生成了以下文件和目录

  1. turing@ubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries$ ls
  2. args.gn build.ninja build.ninja.d NOTICE_FILE obj test_info toolchain.ninja
  • args.gn :一些参数
  • build.ninja : ninja的主文件
  • build.ninja.d :记录生成所有.ninja 所依赖的BUILD.gn文件路劲列表,一个BUILD.gn就生成一个.ninja文件
  • obj :各组件模块构建/编译文件输出地.
  • toolchain :放置ninja规则,将被 subninja 进 build.ninja

build.ninja

build.ninja内容如下:

  1. ninja_required_version = 1.7.2
  2. rule gn
  3. command = ../../../../tools/gn --root=../../.. -q --dotfile=../../../build/lite/.gn --script-executable=python3 gen .
  4. description = Regenerating ninja files
  5. build build.ninja: gn
  6. generator = 1
  7. depfile = build.ninja.d
  8. subninja toolchain.ninja
  9. build ability: phony ./libability.so
  10. build ability_notes: phony obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/ability_notes.stamp
  11. build ability_test: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/ability_test.stamp
  12. build ability_test_pageAbilityTest_group_lv0: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/test_lv0/page_ability_test/ability_test_pageAbilityTest_group_lv0.stamp
  13. #此处省略诸多 phony ..
  14. build all: phony $
  15. ./libcameraApp.so $
  16. obj/applications/sample/camera/cameraApp/cameraApp_hap.stamp $
  17. ./libgallery.so $
  18. ...
  19. default all

解读

  • 前面部分是定义一个 gn规则,用于干嘛呢? 重新生成一遍 *ninja文件
  • subninja相当于 #include文件
  • default all,指定默认的一个或多个target

toolchain | 定义规则

toolchain.ninja 定义了编译c,c++,汇编器,链接,静态/动态链接库,时间戳,拷贝等规则. 内容如下:

  1. rule cxx
  2. command = /root/llvm/bin/clang++ ${defines} ${include_dirs} ${cflags_cc} -c ${in} -o ${out}
  3. description = clang++ ${out}
  4. depfile = ${out}.d
  5. deps = gcc
  6. rule alink
  7. command = /root/llvm/bin/llvm-ar -cr ${out} @"${out}.rsp"
  8. description = AR ${out}
  9. rspfile = ${out}.rsp
  10. rspfile_content = ${in}
  11. rule link
  12. command = /root/llvm/bin/clang ${ldflags} ${in} ${libs} -o ${output_dir}/bin/${target_output_name}${output_extension}
  13. description = LLVM LINK ${output_dir}/bin/${target_output_name}${output_extension}
  14. rspfile = ${output_dir}/bin/${target_output_name}${output_extension}.rsp
  15. rspfile_content = ${in}
  16. rule solink
  17. command = /root/llvm/bin/clang -shared ${ldflags} ${in} ${libs} -o ${output_dir}/${target_output_name}${output_extension}
  18. description = SOLINK ${output_dir}/${target_output_name}${output_extension}
  19. rspfile = ${output_dir}/${target_output_name}${output_extension}.rsp
  20. rspfile_content = ${in}
  21. rule stamp
  22. command = /usr/bin/touch ${out}
  23. description = STAMP ${out}
  24. rule asm
  25. command = /root/llvm/bin/clang ${include_dirs} ${asmflags} -c ${in} -o ${out}
  26. description = ASM ${out}
  27. depfile = ${out}.d
  28. deps = gcc
  29. rule cc
  30. command = /root/llvm/bin/clang ${defines} ${include_dirs} ${cflags} ${cflags_c} -c ${in} -o ${out}
  31. description = clang ${out}
  32. rule copy
  33. command = cp -afd ${in} ${out}
  34. description = COPY ${in} ${out}
  • 注意这些规则中的描述description字段,其后面的内容会打到控制台上,每一条输出都是一次 build,如图所示,通过这些描述就知道使用了什么规则去构建.

组件编译

本篇以编译ability组件为例说明 ninja对组件的编译情况.每个组件都有自己的.ninja,描述组件的编译细节.而整个鸿蒙系统就是由众多的类似.ninja构建编译完成的.

  1. ├── foundation
  2.    ├── aafwk
  3.       └── aafwk_lite
  4.       ├── frameworks
  5.          ├── ability_lite
  6.             └── ability.ninja

ability.ninja内容如下:

  1. defines = -DOHOS_APPEXECFWK_BMS_BUNDLEMANAGER \
  2. -D_XOPEN_SOURCE=700 -DOHOS_DEBUG \
  3. -D_FORTIFY_SOURCE=2 \
  4. -D__LITEOS__ -D__LITEOS_A__
  5. include_dirs = -I../../../foundation/aafwk/aafwk_lite/frameworks/abilitymgr_lite/include \
  6. -I../../../foundation/aafwk/aafwk_lite/frameworks/want_lite/include \
  7. -I../../../foundation/aafwk/aafwk_lite/interfaces/innerkits/abilitymgr_lite \
  8. -I../../../foundation/aafwk/aafwk_lite/interfaces/kits/want_lite \
  9. -I../../../foundation/aafwk/aafwk_lite/interfaces/kits/ability_lite \
  10. -I../../../foundation/appexecfwk/appexecfwk_lite/utils/bundle_lite \
  11. -I../../../foundation/appexecfwk/appexecfwk_lite/interfaces/kits/bundle_lite \
  12. -I../../../foundation/appexecfwk/appexecfwk_lite/frameworks/bundle_lite/include \
  13. -I../../../foundation/graphic/ui/frameworks -I../../../foundation/graphic/surface/interfaces/kits \
  14. -I../../../foundation/distributedschedule/samgr_lite/interfaces/kits/registry \
  15. -I../../../foundation/distributedschedule/samgr_lite/interfaces/kits/samgr \
  16. -I../../../foundation/communication/ipc_lite/frameworks/liteipc/include \
  17. -I../../../kernel/liteos_a/kernel/include \
  18. -I../../../kernel/liteos_a/kernel/common \
  19. -I../../../third_party/bounds_checking_function/include \
  20. -I../../../third_party/freetype/include \
  21. -I../../../utils/native/lite/kv_store/innerkits \
  22. -I../../../utils/native/lite/include \
  23. -I../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/include \
  24. -I../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite \
  25. -I/root/llvm/include/c++/v1 \
  26. -I../../../prebuilts/lite/sysroot/usr/include/arm-liteos \
  27. -I../../../base/hiviewdfx/hilog_lite/interfaces/native/innerkits/hilog \
  28. -I../../../base/hiviewdfx/hilog_lite/interfaces/native/innerkits \
  29. -I../../../third_party/bounds_checking_function/include \
  30. -I../../../third_party/bounds_checking_function/include \
  31. -I../../../foundation/communication/ipc_lite/interfaces/kits \
  32. -I../../../utils/native/lite/include
  33. cflags = -Wall -Wno-format -Wno-format-extra-args -fPIC \
  34. --target=arm-liteos \
  35. --sysroot=/home/openharmony/prebuilts/lite/sysroot \
  36. -Oz -flto -mfloat-abi=softfp -mcpu=cortex-a7 -nostdlib -fno-common -fno-builtin -fno-strict-aliasing -Wall -fsigned-char -mno-unaligned-access -fno-omit-frame-pointer -fstack-protector-all -fPIC
  37. cflags_cc = -Wall -Wno-format -Wno-format-extra-args -fPIC \
  38. --target=arm-liteos \
  39. --sysroot=/home/openharmony/prebuilts/lite/sysroot \
  40. -Oz -flto -mfloat-abi=softfp -mcpu=cortex-a7 -nostdlib -fno-common -fno-builtin -fno-strict-aliasing -Wall -mno-unaligned-access -fno-omit-frame-pointer -fstack-protector-all -fexceptions -std=c++11 -fPIC
  41. target_output_name = libability
  42. build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability.cpp
  43. build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_context.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_context.cpp
  44. build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_env.cpp
  45. build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env_impl.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_env_impl.cpp
  46. build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_event_handler.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_event_handler.cpp
  47. build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_loader.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_loader.cpp
  48. build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_main.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_main.cpp
  49. build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_scheduler.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_scheduler.cpp
  50. build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_thread.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_thread.cpp
  51. build ./libability.so: solink \
  52. obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability.o \
  53. obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_context.o \
  54. obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env.o \
  55. obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env_impl.o \
  56. obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_event_handler.o \
  57. obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_loader.o \
  58. obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_main.o \
  59. obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_scheduler.o \
  60. obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_thread.o \
  61. ./libabilitymanager.so ./libbundle.so ./libhilog_shared.so ./libliteipc_adapter.so \
  62. ./libsec_shared.so ./libutils_kv_store.so || obj/utils/native/lite/kv_store/kv_store.stamp
  63. ldflags = -lstdc++ \
  64. --target=arm-liteos \
  65. --sysroot=/home/openharmony/prebuilts/lite/sysroot \
  66. -L/root/llvm/lib/arm-liteos/c++ \
  67. -L/home/openharmony/prebuilts/lite/sysroot/usr/lib/arm-liteos \
  68. -L/root/llvm/lib/clang/9.0.0/lib/arm-liteos \
  69. -lclang_rt.builtins -lc -lc++ -lc++abi \
  70. --sysroot=/home/openharmony/prebuilts/lite/sysroot \
  71. -mcpu=cortex-a7 -lc \
  72. -L/home/openharmony/out/hispark_aries/ipcamera_hispark_aries \
  73. -Wl,-rpath-link=/home/openharmony/out/hispark_aries/ipcamera_hispark_aries -Wl,-z,now -Wl,-z,relro -Wl,-z,noexecstack
  74. libs =
  75. frameworks =
  76. output_extension = .so
  77. output_dir = .

解读

  • defines,include_dirs,cflags_cc都是用户自定义变量,为了给 rule cxx准备参数,对.cpp的编译使用了这个规则
    1. rule cxx
    2. command = /root/llvm/bin/clang++ ${defines} ${include_dirs} ${cflags_cc} -c ${in} -o ${out}
    3. description = clang++ ${out}
    4. depfile = ${out}.d
    5. deps = gcc
  • in,out是两个内置变量,无须定义,值由build提供,如此就编译成了一个个的 .o文件.
  • 在最后在当前目录下使用了solink规则,生成一个动态链接库libability.so.
    1. rule solink
    2. command = /root/llvm/bin/clang -shared ${ldflags} ${in} ${libs} -o ${output_dir}/${target_output_name}${output_extension}
    3. description = SOLINK ${output_dir}/${target_output_name}${output_extension}
    4. rspfile = ${output_dir}/${target_output_name}${output_extension}.rsp
    5. rspfile_content = ${in}

ability | 最终生成文件

  1. turing@ubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries/obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite$ tree
  2. .
  3. ├── aafwk_abilitykit_lite.stamp
  4. ├── ability.ninja
  5. ├── ability_notes.stamp
  6. └── src
  7. ├── libability.ability_context.o
  8. ├── libability.ability_env_impl.o
  9. ├── libability.ability_env.o
  10. ├── libability.ability_event_handler.o
  11. ├── libability.ability_loader.o
  12. ├── libability.ability_main.o
  13. ├── libability.ability.o
  14. ├── libability.ability_scheduler.o
  15. └── libability.ability_thread.o
  16. 1 directory, 12 files
  17. turing@ubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries/obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite$ stat ability_notes.stamp
  18. File: ability_notes.stamp
  19. Size: 0 Blocks: 0 IO Block: 4096 regular empty file
  20. Device: 805h/2053d Inode: 1217028 Links: 1
  21. Access: (0644/-rw-r--r--) Uid: ( 1000/ turing) Gid: ( 0/ root)
  22. Access: 2021-07-21 00:38:52.237373740 -0700
  23. Modify: 2021-07-21 00:34:30.207312566 -0700
  24. Change: 2021-07-21 00:34:30.207312566 -0700

鸿蒙内核源码分析.总目录

v08.xx 鸿蒙内核源码分析(总目录) | 百万汉字注解 百篇博客分析 | 51.c.h .o

百万汉字注解.百篇博客分析

百万汉字注解 >> 精读鸿蒙源码,中文注解分析, 深挖地基工程,大脑永久记忆,四大码仓每日同步更新< gitee| github| csdn| coding >

百篇博客分析 >> 故事说内核,问答式导读,生活式比喻,表格化说明,图形化展示,主流站点定期更新中< 51cto| csdn| harmony| osc >

关注不迷路.代码即人生

QQ群:790015635 | 入群密码: 666

原创不易,欢迎转载,但请注明出处.

鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗 | 百篇博客分析OpenHarmony源码 | v61.02的更多相关文章

  1. 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01

    百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  2. 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 百篇博客分析OpenHarmony源码 | v59.01

    百篇博客系列篇.本篇为: v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿 ...

  3. 鸿蒙内核源码分析(编译脚本篇) | 如何防编译环境中的牛皮癣 | 百篇博客分析OpenHarmony源码 | v58.01

    百篇博客系列篇.本篇为: v58.xx 鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单 | 51.c.h.o 本篇用两个脚本完成鸿蒙(L1)的编译环境安装/源码下载/编译过程,让编译,调试鸿 ...

  4. 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视GCC编译全过程 | 百篇博客分析OpenHarmony源码| v57.01

    百篇博客系列篇.本篇为: v57.xx 鸿蒙内核源码分析(编译过程篇) | 简单案例窥视编译全过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

  5. 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙看这篇或许真的够了 | 百篇博客分析OpenHarmony源码 | v50.06

    百篇博客系列篇.本篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉 ...

  6. v72.01 鸿蒙内核源码分析(Shell解析) | 应用窥伺内核的窗口 | 百篇博客分析OpenHarmony源码

    子曰:"苟正其身矣,于从政乎何有?不能正其身,如正人何?" <论语>:子路篇 百篇博客系列篇.本篇为: v72.xx 鸿蒙内核源码分析(Shell解析篇) | 应用窥视 ...

  7. v75.01 鸿蒙内核源码分析(远程登录篇) | 内核如何接待远方的客人 | 百篇博客分析OpenHarmony源码

    子曰:"不学礼,无以立 ; 不学诗,无以言 " <论语>:季氏篇 百篇博客分析.本篇为: (远程登录篇) | 内核如何接待远方的客人 设备驱动相关篇为: v67.03 ...

  8. v76.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式 | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(共享内存篇) | 进程间最快通讯方式 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) | 同样 ...

  9. v79.01 鸿蒙内核源码分析(用户态锁篇) | 如何使用快锁Futex(上) | 百篇博客分析OpenHarmony源码

    百篇博客分析|本篇为:(用户态锁篇) | 如何使用快锁Futex(上) 进程通讯相关篇为: v26.08 鸿蒙内核源码分析(自旋锁) | 当立贞节牌坊的好同志 v27.05 鸿蒙内核源码分析(互斥锁) ...

随机推荐

  1. 【HMC Core 6.0全球上线】图形计算服务新插件,助力高画质3D手游创新

    HMS Core 6.0已于7月15日全球上线,本次新版本向广大开发者开放了众多全新能力与技术.其中华为图形计算服务(CG Kit)开放了体积雾插件和流体插件,为3D手游画面的提升提供了坚实的技术基础 ...

  2. 连接共享打印机失败错误代码0x80070035

    局域网内共享打印机非常方便,但是在连接中经常遇到问题,其中出现错误代码0x80070035的概率非常之高! 1.必须确保有关打印功能的相关服务都处于自动启动状态,重点检查TCP/IP NetBIOS ...

  3. SpringBoot快速搭建流程

    创建一个新项目 使用maven创建一个新项目 给定项目名称.finsh完成创建 跑起来SpringBoot 引入依赖parent > SpringBoot父级依赖,spring-boot-sta ...

  4. 虚拟dom?diff算法?key?Vue原理的核心三问?打包教你搞定。

    为什么需要虚拟DOM 先介绍浏览器加载一个HTML文件需要做哪些事,帮助我们理解为什么我们需要虚拟DOM.webkit引擎的处理流程,如下图所示: 所有浏览器的引擎工作流程都差不多,如上图大致分5步: ...

  5. go defer关键字使用规则

    defer 用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行 数据结构 type _defer struct { sp uintptr //函数栈指针 pc ...

  6. ROS入门学习(基于Ubuntu16.04+kinetic)

    本文主要部分全部来源于ROS官网的Tutorials. Setup roscore # making sure that we have roscore running rosrun turtlesi ...

  7. 1day漏洞反推技巧实战(2)

    学习存货(2) CVE-2018-11784简单分析之反推的魅力 看着挺有趣的,简单分析下: 通过搜索tomcat漏洞找到: http://tomcat.apache.org/security-7.h ...

  8. 安装配置Linux Squid代理服务器

    1.代理服务器的工作机制 代理服务器的工作机制像生活中的代理商,假设自己的机器为A,想获得的数据由服务器B提供,代理服务器为C,那么连接过程是,A需要B的数据,并直接和C连接:C接受到A的数据请求之后 ...

  9. introduction-to-64-bit-assembly

    introduction-to-64-bit-assembly NASM - The Netwide Assembler x86-64 下函数调用及栈帧原理 汇编语言基本概念简介 mycode

  10. zabbix 批量安装+自动注册

    环境介绍 zabbix版本Zabbix 4.2.6 zabbix server:10.0.10.234 zabbix-agent:16台 Linux 7.x设备   自动发现 自动发现的好处:快速发现 ...