openssl3.2 - 编译 - zlib.dll不要使用绝对路径

文章目录

    • openssl3.2 - 编译 - 编译时的动态库zlib.dll不要使用绝对路径
    • 概述
    • 测试zlib特性在安装好的目录中是否正常
    • 笔记
    • 70-test_tls13certcomp.t
    • 80-test_cms.t
    • 对测试环境的猜测
    • 从头再编译测试安装一次
    • 测试一下随便改变位置的openssl用到zlib时是否好使
    • 测试一下随便改变位置的openssl未找到zlib.dll时是否报错
    • 总结
    • END

openssl3.2 - 编译 - 编译时的动态库zlib.dll不要使用绝对路径

概述

前面编译了openssl3.2(openssl3.2 - 编译), 编译命令行中使用加ZLIB特性时, 使用了绝对路径, 如下:

打开vs2019x64本地命令行, 选择管理员身份运行
set path=c:\nasm;%path%
cd /d D:\3rd_prj\crypt\openssl-3.2.0
perl Configure VC-WIN64A --debug zlib-dynamic --with-zlib-include=c:\zlib_1d3 --with-zlib-lib=c:\zlib_1d3\my_zlib_1d3.dll --prefix=c:\openssl_3d2 --openssldir=c:\openssl_3d2\common
nmake
nmake test
nmake install


如果在本机做实验没问题.
前几天, 为了归档方便, 将openssl安装好的路径移动到归档目录中.
在这里插入图片描述
再运行openssl和zlib相关的功能, 就有报错提示, 说找不到 c:\zlib_1d3\my_zlib_1d3.dll
这样就没法在其他计算机上用啊.
尝试将在openssl编译时用的zlib.dll指定为相对路径 e.g. .\my_zlib_1d3.dll
将my_zlib_1d3.dll拷贝到openssl源码目录.\下
再编译(config , nmake), 然后在nmake test时, 报错如下:

07-test_bio_comp.t                    (Wstat: 256 Tests: 1 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
70-test_tls13certcomp.t               (Wstat: 5632 Tests: 1 Failed: 0)
  Non-zero exit status: 22
  Parse errors: Bad plan.  You planned 8 tests but ran 1.
75-test_quicapi.t                     (Wstat: 256 Tests: 1 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
80-test_cms.t                         (Wstat: 256 Tests: 22 Failed: 1)
  Failed test:  5
  Non-zero exit status: 1
80-test_ssl_new.t                     (Wstat: 1280 Tests: 31 Failed: 5)
  Failed tests:  4, 20, 22, 26, 31
  Non-zero exit status: 5
80-test_ssl_old.t                     (Wstat: 512 Tests: 7 Failed: 2)
  Failed tests:  2-3
  Non-zero exit status: 2
90-test_cert_comp.t                   (Wstat: 256 Tests: 1 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
90-test_rpk.t                         (Wstat: 256 Tests: 1 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
90-test_shlibload.t                   (Wstat: 1024 Tests: 10 Failed: 4)
  Failed tests:  1-4
  Non-zero exit status: 4
90-test_sslapi.t                      (Wstat: 256 Tests: 4 Failed: 1)
  Failed test:  1
  Non-zero exit status: 1
Files=294, Tests=3411, 1091 wallclock secs ( 5.14 usr +  1.11 sys =  6.25 CPU)
Result: FAIL
NMAKE : fatal error U1077: “cmd”: 返回代码“0x1”
Stop.
NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64\nmake.exe"”: 返回代码“0x2”
Stop.

看了bio_comp_test.c, 有和zlib相关的函数调用.
再将my_zlib_1d3.dll拷贝到bio_comp_test.exe所在的.\test目录下, 再运行nmake test, 还是有报错, 如下:

70-test_tls13certcomp.t               (Wstat: 5632 Tests: 1 Failed: 0)
  Non-zero exit status: 22
  Parse errors: Bad plan.  You planned 8 tests but ran 1.
80-test_cms.t                         (Wstat: 256 Tests: 22 Failed: 1)
  Failed test:  5
  Non-zero exit status: 1
Files=294, Tests=3411, 1069 wallclock secs ( 5.56 usr +  1.08 sys =  6.64 CPU)
Result: FAIL
NMAKE : fatal error U1077: “cmd”: 返回代码“0x1”
Stop.
NMAKE : fatal error U1077: “"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64\nmake.exe"”: 返回代码“0x2”
Stop.

这2个.t看不太懂. 估计也是和zlib库位置相关.
准备安装后(nmake install)后, 再手工测试一下, zlib特性是否正常.
安装后的目录c:\openssl_3d2拷贝到 D:\my_dev\lib\openssl_3d2, 看到.bin目录中没有my_zlib_1d3.dll, 自己补了一个.
怪不得网上资料, 大部分openssl编译都是用的zlib静态库, 原来openssl用动态库这么麻烦.

测试zlib特性在安装好的目录中是否正常

在安装后, 拷贝的目录(D:\my_dev\lib\openssl_3d2)中来测试.

先在源码编译目录(D:\3rd_prj\crypt\openssl-3.2.0)记录一下测试的日志

nmake test > my_log_nmake_test.txt 2>&1

然后根据日志, 在安装拷贝完的目录(D:\my_dev\lib\openssl_3d2)中模拟报错的测试日志做测试.

笔记

只能在openssl源码目录中测试.
从日志中看到了测试的命令行, 整理了一个脚本

rem my_nmake_test.bat
cmd /C "set "SRCTOP=." & set "BLDTOP=." & set "PERL=C:\Perl\bin\perl.exe" & set "FIPSKEY=f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813" & "C:\Perl\bin\perl.exe" ".\test\run_tests.pl" "

这个脚本依赖环境和配置, 在安装后的目录, 测试失败. 必须在源码编译目录运行.
将test目录压缩备份, 然后将test目录中, 只有70-test_tls13certcomp.t/80-test_cms.t, 来单独测试

因为安装前的openssl.exe在 D:\3rd_prj\crypt\openssl-3.2.0\apps
将my_zlib_1d3.dll拷贝到D:\3rd_prj\crypt\openssl-3.2.0\apps
将test目录压缩备份.
将 D:\3rd_prj\crypt\openssl-3.2.0\test\recipes 目录改名为 D:\3rd_prj\crypt\openssl-3.2.0\test\recipes_
然后新建一个目录 D:\3rd_prj\crypt\openssl-3.2.0\test\recipes作为测试目录

70-test_tls13certcomp.t

将recipes_中的70-test_tls13certcomp.t拷贝到 D:\3rd_prj\crypt\openssl-3.2.0\test\recipes
现在 D:\3rd_prj\crypt\openssl-3.2.0\test\recipes目录中只有70-test_tls13certcomp.t
将 my_nmake_test.bat 拷贝到D:\3rd_prj\crypt\openssl-3.2.0, 运行 my_nmake_test.bat


D:\3rd_prj\crypt\openssl-3.2.0>my_nmake_test.bat

D:\3rd_prj\crypt\openssl-3.2.0>rem my_nmake_test.bat

D:\3rd_prj\crypt\openssl-3.2.0>cmd /C "set "SRCTOP=." & set "BLDTOP=." & set "PERL=C:\Perl\bin\perl.exe" & set "FIPSKEY=f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813" & "C:\Perl\bin\perl.exe" ".\test\run_tests.pl" "
Files=0, Tests=0,  0 wallclock secs ( 0.00 usr +  0.00 sys =  0.00 CPU)
Result: NOTESTS
70-test_tls13certcomp.t .. ok
All tests successful.
Files=1, Tests=8, 19 wallclock secs ( 0.09 usr +  0.00 sys =  0.09 CPU)
Result: PASS

D:\3rd_prj\crypt\openssl-3.2.0>

可以看到, 在安装完后, 单独测试70-test_tls13certcomp.t是通过的.

80-test_cms.t

将 D:\3rd_prj\crypt\openssl-3.2.0\test\recipes中的70-test_tls13certcomp.t删掉.
将备份目录D:\3rd_prj\crypt\openssl-3.2.0\test\recipes_中关于80-test_cms.t相关的东西拷贝过来, 如下
在这里插入图片描述
然后在源码编译的根目录运行 my_nmake_test.bat


D:\3rd_prj\crypt\openssl-3.2.0>my_nmake_test.bat

D:\3rd_prj\crypt\openssl-3.2.0>rem my_nmake_test.bat

D:\3rd_prj\crypt\openssl-3.2.0>cmd /C "set "SRCTOP=." & set "BLDTOP=." & set "PERL=C:\Perl\bin\perl.exe" & set "FIPSKEY=f4556650ac31d35461610bac4ed81b1a181b2d8a43ea2854cbae22ca74560813" & "C:\Perl\bin\perl.exe" ".\test\run_tests.pl" "
Files=0, Tests=0,  0 wallclock secs ( 0.02 usr +  0.00 sys =  0.02 CPU)
Result: NOTESTS
80-test_cms.t .. ok
All tests successful.
Files=1, Tests=22, 19 wallclock secs ( 0.02 usr +  0.00 sys =  0.02 CPU)
Result: PASS

D:\3rd_prj\crypt\openssl-3.2.0>

可以看到, 单独测试也是成功的.

对测试环境的猜测

单独测试成功
在编译环境中nmake test失败.
比对一下, 可以发现, 区别是我现在手工拷贝了my_zlib_1d3.dll拷贝到D:\3rd_prj\crypt\openssl-3.2.0\apps
因为未安装前的openssl相关的exe和dll都在my_zlib_1d3.dll拷贝到D:\3rd_prj\crypt\openssl-3.2.0\apps
apps目录中的openssl相关的exe, dll因为依赖my_zlib_1d3.dll, 所以必须要手工拷贝过去, 才能让openssl相关接口运行正常.

那现在直接在源码编译目录运行nmake test, 试试, 应该也是能全部测试通过的.
试试

将备份的D:\3rd_prj\crypt\openssl-3.2.0\test\recipes复原, 里面包含原始的所有测试用例.

D:\3rd_prj\crypt\openssl-3.2.0>nmake test
// ...
99-test_fuzz_server.t ................... ok
99-test_fuzz_smime.t .................... ok
99-test_fuzz_v3name.t ................... ok
99-test_fuzz_x509.t ..................... ok
All tests successful.
Files=294, Tests=3418, 1009 wallclock secs ( 5.88 usr +  1.17 sys =  7.05 CPU)
Result: PASS

D:\3rd_prj\crypt\openssl-3.2.0>

全部测试通过.
果真和自己想的一样, 就是\app目录中, 没有my_zlib_1d3.dll引起的测试失败.

从头再编译测试安装一次

解开官方源码包

打开vs2019x64本地命令行, 选择管理员身份运行

cd /d D:\3rd_prj\crypt\openssl-3.2.0

set path=c:\nasm;%path%

perl Configure VC-WIN64A --debug zlib-dynamic --with-zlib-include=D:\my_dev\lib\zlib_1d3 --with-zlib-lib=.\my_zlib_1d3.dll --prefix=c:\openssl_3d2 --openssldir=c:\openssl_3d2\common

nmake


此时, nmake已经完成.
查一下*.dll的位置, 主要是看libcrypto-3-x64.dll在哪些目录中
在这里插入图片描述
可以看出, 主要是4个目录

.\
.\apps
.\fuzz
.\test

将自己的zlib.dll拷贝到这4个目录
对于我自己的环境, 拷贝情况如下:

D:\my_dev\lib\zlib_1d3\my_zlib_1d3.dll => D:\3rd_prj\crypt\openssl-3.2.0\my_zlib_1d3.dll
D:\my_dev\lib\zlib_1d3\my_zlib_1d3.dll => D:\3rd_prj\crypt\openssl-3.2.0\apps\my_zlib_1d3.dll
D:\my_dev\lib\zlib_1d3\my_zlib_1d3.dll => D:\3rd_prj\crypt\openssl-3.2.0\fuzz\my_zlib_1d3.dll
D:\my_dev\lib\zlib_1d3\my_zlib_1d3.dll => D:\3rd_prj\crypt\openssl-3.2.0\test\my_zlib_1d3.dll

然后继续openssl的测试和安装

nmake test
// ...
99-test_fuzz_x509.t ..................... ok
All tests successful.
Files=294, Tests=3418, 990 wallclock secs ( 6.36 usr +  0.97 sys =  7.33 CPU)
Result: PASS

openssl测试全部通过, 猜测是正确的.
在使用openssl之前, 必须将依赖的dll(e.g. zlib.dll)摆对位置.
开始安装

nmake install

安装完成后, 搜索*.dll, 可以看到依赖的dll(e.g. zlib.dll)没有被拷贝过来.
在这里插入图片描述
手工拷贝zlib.dll到安装后的bin目录.

D:\my_dev\lib\zlib_1d3\my_zlib_1d3.dll => C:\openssl_3d2\bin\my_zlib_1d3.dll

在这里插入图片描述
现在可以将安装好的openssl发布目录C:\openssl_3d2剪切到自己的库目录了 => D:\my_dev\lib\openssl_3d2

测试一下随便改变位置的openssl用到zlib时是否好使

就用普通的cmd窗口.

cd /d D:\my_dev\lib\openssl_3d2\bin
openssl zlib -list
// 下面是输出
Supported ciphers:
-aes-128-cbc               -aes-128-cfb               -aes-128-cfb1
-aes-128-cfb8              -aes-128-ctr               -aes-128-ecb
-aes-128-ofb               -aes-192-cbc               -aes-192-cfb
-aes-192-cfb1              -aes-192-cfb8              -aes-192-ctr
-aes-192-ecb               -aes-192-ofb               -aes-256-cbc
-aes-256-cfb               -aes-256-cfb1              -aes-256-cfb8
-aes-256-ctr               -aes-256-ecb               -aes-256-ofb
-aes128                    -aes128-wrap               -aes128-wrap-pad
-aes192                    -aes192-wrap               -aes192-wrap-pad
-aes256                    -aes256-wrap               -aes256-wrap-pad
-aria-128-cbc              -aria-128-cfb              -aria-128-cfb1
-aria-128-cfb8             -aria-128-ctr              -aria-128-ecb
-aria-128-ofb              -aria-192-cbc              -aria-192-cfb
-aria-192-cfb1             -aria-192-cfb8             -aria-192-ctr
-aria-192-ecb              -aria-192-ofb              -aria-256-cbc
-aria-256-cfb              -aria-256-cfb1             -aria-256-cfb8
-aria-256-ctr              -aria-256-ecb              -aria-256-ofb
-aria128                   -aria192                   -aria256
-bf                        -bf-cbc                    -bf-cfb
-bf-ecb                    -bf-ofb                    -blowfish
-camellia-128-cbc          -camellia-128-cfb          -camellia-128-cfb1
-camellia-128-cfb8         -camellia-128-ctr          -camellia-128-ecb
-camellia-128-ofb          -camellia-192-cbc          -camellia-192-cfb
-camellia-192-cfb1         -camellia-192-cfb8         -camellia-192-ctr
-camellia-192-ecb          -camellia-192-ofb          -camellia-256-cbc
-camellia-256-cfb          -camellia-256-cfb1         -camellia-256-cfb8
-camellia-256-ctr          -camellia-256-ecb          -camellia-256-ofb
-camellia128               -camellia192               -camellia256
-cast                      -cast-cbc                  -cast5-cbc
-cast5-cfb                 -cast5-ecb                 -cast5-ofb
-chacha20                  -des                       -des-cbc
-des-cfb                   -des-cfb1                  -des-cfb8
-des-ecb                   -des-ede                   -des-ede-cbc
-des-ede-cfb               -des-ede-ecb               -des-ede-ofb
-des-ede3                  -des-ede3-cbc              -des-ede3-cfb
-des-ede3-cfb1             -des-ede3-cfb8             -des-ede3-ecb
-des-ede3-ofb              -des-ofb                   -des3
-des3-wrap                 -desx                      -desx-cbc
-id-aes128-wrap            -id-aes128-wrap-pad        -id-aes192-wrap
-id-aes192-wrap-pad        -id-aes256-wrap            -id-aes256-wrap-pad
-id-smime-alg-CMS3DESwrap  -idea                      -idea-cbc
-idea-cfb                  -idea-ecb                  -idea-ofb
-rc2                       -rc2-128                   -rc2-40
-rc2-40-cbc                -rc2-64                    -rc2-64-cbc
-rc2-cbc                   -rc2-cfb                   -rc2-ecb
-rc2-ofb                   -rc4                       -rc4-40
-seed                      -seed-cbc                  -seed-cfb
-seed-ecb                  -seed-ofb                  -sm4
-sm4-cbc                   -sm4-cfb                   -sm4-ctr
-sm4-ecb                   -sm4-ofb

可以看到没有报错, 说明openssl依赖的zlib.dll是正常的.

测试一下随便改变位置的openssl未找到zlib.dll时是否报错

将my_zlib_1d3.dll改个名字, 将后缀加个’_’
在这里插入图片描述
用 openssl zlib -list 命令行再测试一下.


D:\my_dev\lib\openssl_3d2\bin>openssl zlib -list
Supported ciphers:
-aes-128-cbc               -aes-128-cfb               -aes-128-cfb1
-aes-128-cfb8              -aes-128-ctr               -aes-128-ecb
-aes-128-ofb               -aes-192-cbc               -aes-192-cfb
-aes-192-cfb1              -aes-192-cfb8              -aes-192-ctr
-aes-192-ecb               -aes-192-ofb               -aes-256-cbc
-aes-256-cfb               -aes-256-cfb1              -aes-256-cfb8
-aes-256-ctr               -aes-256-ecb               -aes-256-ofb
-aes128                    -aes128-wrap               -aes128-wrap-pad
-aes192                    -aes192-wrap               -aes192-wrap-pad
-aes256                    -aes256-wrap               -aes256-wrap-pad
-aria-128-cbc              -aria-128-cfb              -aria-128-cfb1
-aria-128-cfb8             -aria-128-ctr              -aria-128-ecb
-aria-128-ofb              -aria-192-cbc              -aria-192-cfb
-aria-192-cfb1             -aria-192-cfb8             -aria-192-ctr
-aria-192-ecb              -aria-192-ofb              -aria-256-cbc
-aria-256-cfb              -aria-256-cfb1             -aria-256-cfb8
-aria-256-ctr              -aria-256-ecb              -aria-256-ofb
-aria128                   -aria192                   -aria256
-bf                        -bf-cbc                    -bf-cfb
-bf-ecb                    -bf-ofb                    -blowfish
-camellia-128-cbc          -camellia-128-cfb          -camellia-128-cfb1
-camellia-128-cfb8         -camellia-128-ctr          -camellia-128-ecb
-camellia-128-ofb          -camellia-192-cbc          -camellia-192-cfb
-camellia-192-cfb1         -camellia-192-cfb8         -camellia-192-ctr
-camellia-192-ecb          -camellia-192-ofb          -camellia-256-cbc
-camellia-256-cfb          -camellia-256-cfb1         -camellia-256-cfb8
-camellia-256-ctr          -camellia-256-ecb          -camellia-256-ofb
-camellia128               -camellia192               -camellia256
-cast                      -cast-cbc                  -cast5-cbc
-cast5-cfb                 -cast5-ecb                 -cast5-ofb
-chacha20                  -des                       -des-cbc
-des-cfb                   -des-cfb1                  -des-cfb8
-des-ecb                   -des-ede                   -des-ede-cbc
-des-ede-cfb               -des-ede-ecb               -des-ede-ofb
-des-ede3                  -des-ede3-cbc              -des-ede3-cfb
-des-ede3-cfb1             -des-ede3-cfb8             -des-ede3-ecb
-des-ede3-ofb              -des-ofb                   -des3
-des3-wrap                 -desx                      -desx-cbc
-id-aes128-wrap            -id-aes128-wrap-pad        -id-aes192-wrap
-id-aes192-wrap-pad        -id-aes256-wrap            -id-aes256-wrap-pad
-id-smime-alg-CMS3DESwrap  -idea                      -idea-cbc
-idea-cfb                  -idea-ecb                  -idea-ofb
-rc2                       -rc2-128                   -rc2-40
-rc2-40-cbc                -rc2-64                    -rc2-64-cbc
-rc2-cbc                   -rc2-cfb                   -rc2-ecb
-rc2-ofb                   -rc4                       -rc4-40
-seed                      -seed-cbc                  -seed-cfb
-seed-ecb                  -seed-ofb                  -sm4
-sm4-cbc                   -sm4-cfb                   -sm4-ctr
-sm4-ecb                   -sm4-ofb
D4B80400:error:12800067:DSO support routines:win32_load:could not load the shared library:crypto\dso\dso_win32.c:108:filename(.\\my_zlib_1d3.dll)
D4B80400:error:12800067:DSO support routines:DSO_load:could not load the shared library:crypto\dso\dso_lib.c:147:

D:\my_dev\lib\openssl_3d2\bin>

可以看到有报错, 说没有找到’.\my_zlib_1d3.dll’

总结

这说明让openssl编译选项中的动态依赖的dll为.\x.dll, 是比较好的方法.
只要openssl的组件和依赖的dll同目录时, 就可以让编译完的openssl输出的组件随意变动位置, 都可以正常运行.

END

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【爬虫逆向实战篇】定位加密参数、断点调试与JS代码分析

文章目录 1. 写在前面2. 确认加密参数3. 加密参数定位4. XHR断点调试 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向…

实战一个 Jenkins 构建 CI/CD流水线 的简单配置过程哈

引言:上一期我们讲述了gitlabCI/CD工具的介绍,工具之争,本期我们介绍Jenkins CI/CD 目录 一、Jenkins介绍 1、Jenkins概念 2、Jenkins目的 3、特性 4、产品发布流程 二、安装Jenkins 1、安装JDK 2、安装Jenkins 1、上传压缩包 2、…

(done) 如何判断一个矩阵是否可逆?

参考视频:https://www.bilibili.com/video/BV15H4y1y737/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这个视频里还暗含了一些引理 1.若 AX XB 且 X 和 A,B 同阶可逆,那么 A 和 B 相似。原因&#xff1…

北航复试知识点总结

2024.2.25 住行 报道+机试+两天面试=4天 面试流程 (每个人大概20min,早一点到考场!) 形式:5位老师(一记录,四提问) 老师 陆峰 办公地址:北京航空航天大学新主楼H1033 电子邮箱: lufeng@buaa.edu.cn 个人主页:http://shi.buaa.edu.cn/lufeng/ 面试礼仪 于无形中…

编曲学习:高叠和弦 挂留和弦 和弦实战应用

高叠和弦 挂留和弦 和弦实战应用小鹅通-专注内容付费的技术服务商https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65d4826fe4b04c10a1310517?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv 七和弦 以三和弦举例,三和弦上面叠一个三度的音,就变成了七和弦。 从下到…

Spring Boot利用Kaptcha生成验证码

生成验证码 我们在登录或注册某个网站的时候,会需要我们输入验证码,才能登录注册,那么如何生成验证码呢?其实,生成验证码我们可以用Java Swing在后台内存里的区域画一个出来,但是非常麻烦,所以…

WIFI EEPROM 简略分析-MT7628 EEPROM ANALYSIS

经常做WIFI的同学都了解,硬件设计完成后经过射频的测试满足设计要求后,在量产以及生产中都需要对WIFI的射频需要校准,保证产品射频输出功率的一致性。 在开发阶段就必须需要了解WIFI的EEPROM都是一些什么参数,一般在硬件开发阶段会拿到芯片厂家都SDK,里面都包含对EEPROM的…

用什么软件制作电子杂志

想要制作高大上的电子杂志?别再烦恼啦!今天给大家推荐一款超级实用的软件,让你轻松制作出专业水准的电子杂志! 这款软件功能强大,操作简单,适合所有对设计感兴趣的小伙伴们。无论是新手还是专业设计师&…

代码随想录算法训练营第二十五天 | 216.组合总和III,17.电话号码的字母组合 [回溯篇]

代码随想录算法训练营第二十五天 LeetCode 216.组合总和III题目描述思路参考代码总结 LeetCode 17.电话号码的字母组合题目描述思路参考代码 LeetCode 216.组合总和III 题目链接:216.组合总和III 文章讲解:代码随想录#216.组合总和III 视频讲解&#xff…

javascript监听浏览器离开、进入行为

document.addEventListener(visibilitychange, () > {if (document.visibilityState hidden) {alert(离开)}if (document.visibilityState visible) {alert(进入)}}) visibilitychange是浏览器新添加的一个事件,当其选项卡的内容变得可见或被隐藏时&#xff0…

React组件通讯

组件通讯 组件是一个独立的单元,默认情况下组件只能自己使用自己的数据。在组件化过程中,我们将一个完整的功能拆分成多个组件,便于更好的完成整个应用的功能。 Props 组件本来是封闭的,要接受外部数据应该可以通过Props来实现…

opencv图像处理

// 提取路口轮廓集合&#xff08;每个路口的轮廓为一系列点集&#xff09; std::vector<std::vector<cv::Point>> node_contours; std::vector<cv::Vec4i> node_hierarchy;保存轮廓的层次关系// 只提取外轮廓 轮廓近似方法&#xff1a;水平垂直对角线只保留端…

CSP-202209-3-防疫大数据

CSP-202209-3-防疫大数据 解题思路 一、数据结构定义 对于大模拟的题&#xff0c;合适的数据结构选择十分重要&#xff0c;正确的数据结构选择能够有效的提升解题效率 // 漫游消息结构体 struct RoamingData {int date, user, region; };vector<RoamingData> roamin…

C#与VisionPro联合开发——TCP/IP通信

TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是一组用于在网络上进行通信的通信协议。它是互联网和许多局域网的基础&#xff0c;为计算机之间的数据传输提供了可靠性、有序性和错误检测。在软件开发中&#xff0c;TCP/IP 通信通常用于实现网络应用程序之间的数据交…

YOLOv5算法进阶改进(17)— 添加BiFormer注意力机制 | 提升小目标检测精度

前言:Hello大家好,我是小哥谈。本文主要通过对YOLOv5模型添加Bifommer注意力机制为例,让大家对于YOLOv5模型添加注意力机制有一个深入的理解,通过本文你不仅能够学会添加Biformer注意力机制,同时可以举一反三学会其他的注意力机制的添加。🌈 前期回顾: YOLOv5算法进…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(八)NodeJS入门——http模块

一念心清净&#xff0c;处处莲花开。 055_http模块_网页资源加载基本过程 哈喽&#xff0c;大家好&#xff0c;这一课节我们来介绍一下网页资源加载的基本过程。首先先强调一点&#xff0c;这个内容对于我们后续学习非常非常的关键&#xff0c;所以大家务必要将其掌握。 首先先…

hbuilderx创建、运行uni-app

创建uni-app 在点击工具栏里的文件 -> 新建 -> 项目&#xff1a; 选择uni-app类型&#xff0c;输入工程名&#xff0c;选择模板&#xff0c;点击创建&#xff0c;即可成功创建。 uni-app自带的模板有 Hello uni-app &#xff0c;是官方的组件和API示例。还有一个重要模…

人人都是项目管理者,项目管理的基础入门

一、教程描述 本套教程旨在系统介绍项目管理的方法论&#xff0c;帮助大家认识、熟悉、体验、思考项目管理&#xff0c;全面掌握项目管理的流程与方法&#xff0c;快速成长为时代紧缺型的项目管理人才。本套项目管理入门教程&#xff0c;大小805.40M&#xff0c;共有13个文件。…

智慧农业—农业资源数据中心

综述 农业资源数据中心建设的目标是将大量的农业生产信息通过采集、清洗、核准后实现统一存储、统一管理,实现数据的共享和集中管理,保障数据的安全,也为数据的挖掘分析提供决策分析创造条件。 农业资源数据中心的数据架构如下图所示: (1)农业专家数据库。主要收录国内、…

三步实现SpringBoot全局日志记录,整合Echarts实现数据大屏

&#x1f680; 注重版权&#xff0c;转载请注明原作者和原文链接 小袁博客&#xff1a;https://boke.open-yuan.com/小袁博客后台&#xff1a;https://boke.open-yuan.com/back-manager/更多项目内容关注小红书&#x1f50d;OpenYuan开袁 http://xhslink.com/I9zNaC有需求可以在…