当前位置: 首页 > news >正文

dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结

目录

1、问题说明

2、dll库的隐式加载与动态加载

2.1、dll库的隐式加载

2.2、dll库的显式加载

3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功

3.1、使用Process Explorer查看进程加载的dll库信息

3.2、使用Process Explorer查看动态启动的库有没有加载成功

4、dll库加载失败原因详细分析与说明

4.1、dll位数与依赖它的模块位数不一致,导致dll库加载失败

4.2、dll库依赖的库有问题,导致dll加载失败

4.2.1、dll库依赖的库在当前系统中找不到

4.2.2、dll库调用其依赖的库中的接口,但该接口在被依赖的库中找不到

4.3、使用Dependency Walker工具查看dll库的依赖关系以及调用的接口

5、最后


       最近技术群一个朋友遇到一个程序启动异常以及dll库加载失败的问题,找我帮忙看一下,看看是什么原因导致的。其实这个问题不难,只要之前详细看过我博客相关文章的朋友,肯定能很快定位出来的。本文对dll库加载失败导致程序启动报错以及dll库加载失败的常见原因进行总结,以供大家参考。

1、问题说明

       朋友在用VS调试运行他们的程序时,程序中有异常,在VS的输出窗口中也看到了相关打印,如下所示:

​然后接下来,在使用LoadLibraryEx去加载某个dll库时也加载失败了,LoadLibraryEx返回NULL,如下所示:

​可以确定截图中绝对路径中的dll文件是存在的,但还是加载失败了。

       至于为什么要用LoadLibrary而要用扩展接口LoadLibraryEx,并且传入LOAD_WITH_ALTERED_SEARCH_PATH参数,,可以查看我之前写的文章:
查看开源操作系统ReactOS源码,解决dll库动态库加载失败问题(调用LoadLibrary加载失败)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/129200442

我们在项目中遇到过几次使用LoadLibrary加载dll库失败的问题,dll库的路径是正确的(文件是存在的),但就是加载失败!当时深入研究了一下,参考Reactos开源系统中的regsvr32.exe中加载dll库的源码实现,将LoadLibrary改成了LoadLibraryEx,并传入LOAD_WITH_ALTERED_SEARCH_PATH参数。

2、dll库的隐式加载与动态加载

       程序启动时,系统会给程序分配指定大小的进程空间(虚拟内存空间),系统先将exe主程序依赖的多个dll库加载到进程空间中,然后再将exe主程序文件加载到进程空间中,然后进入main函数,程序开始运行。如果启动过程有dll库加载失败(非动态加载,且会弹出报错提示框),则程序启动终止,程序启动失败!

       程序中引用dll(调用dll中的接口),在dll加载时,可分隐式加载和动态显式加载两种方式。隐式加载是引入dll库对应的lib库,在链接时需要链接到代码中调用的dll的导出接口;

2.1、dll库的隐式加载

       所谓隐式加载,就是在程序中使用#pragma预编译指令引入dll库对应的lib导入库:

#pragma comment( lib, "libcurl.lib")

或者在VS的工程配置中配置导入库:

​对于隐式加载的库,在引入lib导入库之后,并包含dll库的头文件,就可以直接在代码中调用dll库的API接口了。

       隐式加载的dll库,在程序启动时就加载了(上面已经讲了程序启动时dll库的加载流程),如果dll库加载失败,则立即终止exe主程序的启动流程,程序启动失败。

2.2、dll库的显式加载

       dll库的显式加载,是调用LoadLibrary或者LoadLibraryEx去动态地加载dll库。

       对于显式加载的库,需要调用GetProcAddress接口去获取dll库中API接口的函数,然后通过该地址去调用API函数。比如如下的一段代码:

BOOL AutoRegsvr32( LPCTSTR lpszDllPath )
{if ( lpszDllPath == NULL ){return;}// 改用LoadLibraryEx,并使用LOAD_WITH_ALTERED_SEARCH_PATH参数,避免部分系统无法加载到dll的问题。HINSTANCE hInstLib = LoadLibraryEx( lpszDllPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH );if ( NULL == hInstLib ){return FALSE;}typedef HRESULT (*DllRegisterServer)(void);DllRegisterServer dllRegisterServer = (DllRegisterServer)GetProcAddress( hInstLib, "DllRegisterServer" );if ( dllRegisterServer != NULL ){HRESULT hr = dllRegisterServer();}else{FreeLibrary(hInstLib);return FALSE;}FreeLibrary(hInstLib);return TRUE;
}

       显式加载的dll库,不会在程序启动时加载,而是在代码执行到LoadLibrary或者LoadLibraryEx函数的调用时才会动态的加载。如果dll库加载失败,也不会导致程序启动失败。

       当动态加载dll库失败时,不像通过dll对应的lib导入库隐式调用dll库,不会弹出报错提示框。对于通过dll对应的lib导入库隐式调用dll库加载失败时(一般是在程序启动时),如果依赖的库在当前系统中找不到,则会报出类似如下的错误:

​       如果程序中调用的接口在对应的dll库中找不到(一般是库与库之间的版本不一致导致的),则会报类似如下的错误:

如果是动态加载dll失败,不管是哪种原因,都不会弹出上述报错提示框。


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:该精品技术专栏的订阅量已达到520多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,预计更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法,详细讲述了C++软件的调试方法与手段,以图文并茂的方式给出具体的项目问题实战分析实例(很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:(本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,订阅量已达160多个,专栏文章已经更新到400多篇,持续更新中...)

C/C++实战进阶(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据结构与算法、C++11及以上新特性(不仅看开源代码会用到,日常编码中也会用到部分新特性,面试时也会涉及到)、常用C++开源库的介绍与使用、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(排查软件异常的手段与方法、分析C++软件异常的基础知识、常用软件分析工具使用、实战问题分析案例等)、设计模式、网络基础知识与网络问题分析进阶内容等。

专栏3:  

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏4:   

VC++常用功能开发汇总(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5: 

C++ 软件开发从入门到精通(专栏文章,持续更新中...)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了C/C++软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功

       我们可以使用Process Explorer工具查看程序加载的哪些dll库,以及这些dll库的详细信息。还可以查看动态加载的库有没有加载成功。

3.1、使用Process Explorer查看进程加载的dll库信息

       可以使用Process Explorer工具查看进程加载的dll库列表,在dll列表中可以看到加载的dll库的详细信息。打开Process Explorer后:

​在进程列表中找到目标进程,点击选中该进程,下方就会显示本进程加载的dll库列表,在dll列表中可以查看这些库的详细信息,比如加载的dll库的路径、库的版本等。通过库的路径或版本,确定是否加载了正确版本的dll库。

       注意,如果是在电脑上第一次启动Process Explorer,需要在第一次启动该工具时点击工具栏中的“View DLLs”图标按钮:

​才会显示目标进程加载的库列表。默认情况下显示的是句柄占用信息。

       前段时间有粉丝朋友告诉我,微软官方最近更新升级了Process Explorer工具(微软官方提供的工具),软件的主界面发生了变化,询问新版本如何查看进程占用的dll列表,于是我到微软官网下载了该工具。其实很简单,要查看进程加载的dll列表,直接点击下方的“DLLs”标签页即可

3.2、使用Process Explorer查看动态启动的库有没有加载成功

       上面我们说了,隐式加载的dll,会在程序启动时加载,如果dll库加载失败,则程序的启动会被立即终止;而动态加载的dll,不会在程序启动时加载,不会影响程序的启动。所以,程序启动起来后,只会存在动态加载的dll库加载失败,隐式加载的dll库肯定都成功加载起来了,否则程序会启动失败。

       如何判断动态启动的库有没有加载成功呢?其实很简单,只要看dll库列表中有没有这个给dll就知道了。

       那程序运行时,我们怎么感知动态加载的dll库没有加载成功呢?只能根据程序业务来判断,即执行到动态库相关的业务,没有正常执行时,则可能时动态加载的dll库加载失败导致的。在我们的项目中,底层若干业务模块就是动态加载的,上层产品根据自己的需要去选择性加载部分业务模块即可,我们在产品开发联调时经常遇到dll库动态加载失败的问题,所以我在处理这方面问题时比较有经验一点。

4、dll库加载失败原因详细分析与说明

       这里我们讨论一下dll加载失败的原因,不管是通过dll库的导入库隐式加载的,还是通过调用LoadLibrary或者LoadLibraryEx动态加载的,原因都是一样的,主要有以下三个原因:

1)问题dll的位数与依赖它的模块位数不一致;
2)问题dll依赖的库在当前系统中找不到;
3)问题dll调用底层库的接口,在底层库中找不到。

       dll隐式加载失败与dll动态加载失败不同的地方在于现象有所有不同。dll隐式加载失败时(一般在程序启动时),会弹出报错提示框;而dll动态加载失败时,则不会弹出报错提示框,开发人员只能根据业务异常去感知。至于弹出什么样的报错提示框,上面我已经讲过了,在此不再赘述。

4.1、dll位数与依赖它的模块位数不一致,导致dll库加载失败

        如果dll库加载失败,我们可以确认一下dll库的位数是否与依赖该dll的模块(依赖该dll的模块可能是其他dll,也可能是exe主程序)的位数一致,因为32位dll库是不能和64位模块混用的,位数必须要一致才能使用。当然这种情况在项目中比较少见,这只是一种可能的原因,实际项目中比较少,一般不用关注这种情况。比如32位的exe主程序是不能加载使用64位dll库的,如果将位数不同的模块混在一起,程序启动时回报0xC000007B错误,如下所示:

​       什么情况下会出现模块与模块之间的位数不一致呢?比如我们在日常开发调试过程中遇到的一个问题,发布32位程序时,要将相关C++运行时库一起打包发布,结果错误拷贝了64位运行时库(现在大家用的基本都是Win10系统,系统中既有32位的库,也有64位的库),导致程序启动报0xC000007B错误。关于0xC000007B错误的实战分析案例,可以查看我之前写的文章:

使用Dependency Walker和Process Explorer排查程序启动时缺少ucrtbase.dll等运行时库以及报0xC000007B错误icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/131505299       至于如何查看dll、exe等二进制文件的位数,可以用dumpbin.exe或者PE查看工具EXE Explorer,相关查看方法可以查看我的文章:
使用Dumpbin工具查看C++二进制文件的位数、时间戳及dll库的依赖关系icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140153214如何查看exe和dll等二进制文件的生成时间(时间戳)和位数(32位/64位)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140043291

4.2、dll库依赖的库有问题,导致dll加载失败

       dll库依赖的库有问题(当前问题dll依赖的更下层的库),主要有两种情况:

1)dll库依赖的库在当前系统中找不到;
2)dll库中调用了其依赖库中的接口,但该接口在被依赖的库中找不到。

4.2.1、dll库依赖的库在当前系统中找不到

        如果dll库依赖的库在当前系统中找不到,则该dll库会加载失败(加载dll之前,会先将当前dll依赖的库先加载起来,依赖的库都加载起来后,才会去加载当前的dll)。

        如果该dll库是隐式加载的,则一般在程序启动时加载,会报类似这个错误:

​这个问题在我们项目中也经常出现,引发这类问题可能有两个典型的场景:

1)一个场景是,在发布程序时,没有将程序模块依赖的C/C++运行时dll库一起发布,而这些运行时库在其他电脑上可能没有,所以我们在发布程序时要将相关运行时库带上。
2)另一个场景是,底层模块因为重构或者业务需要,新增了一个dll模块,没有通知上层产品,导致上层软件产品在打包时没有将新增的dll库打包进去。

4.2.2、dll库调用其依赖的库中的接口,但该接口在被依赖的库中找不到

       如果dll库调用其依赖的库中的接口在被依赖的库中找不到,则该dll库也会加载失败。如果该dll库是隐式加载的,则在程序启动时会报类似这个错误:

​出现这类问题,一般是库与库的版本不一致导致的。在编译时引用了正确的dll库的导入库lib,编译是没问题的,但在程序打包时拷贝的是老版本的dll库,导致程序运行时出现调用的接口在底层的库中找不到。

       至于为什么在依赖库中找不到接口呢?可能找不到的接口,在新版本库中被删除了,或者接口名称被修改了,亦或是接口的参数被修改了(比如增加了参数、删除了参数或者修改了参数类型)。关于接口参数被修改导致找不到接口的实例:

​可以查看我之前写的文章:

使用Process Explorer和Dependency Walker排查dll动态库没法调试的问题(dll库加载失败导致没法动态调试)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140803687        还有一种情况就是,程序中调用了Windows系统的系统dll库中的某个接口,该接口只在高版本的Windows系统中才有,比如只在Win10系统才有,Win7系统中的系统库中没有这个接口,这样将程序拷贝到Win7系统中运行就会报接口找不到的错误,因为Win7系统库中没有这个接口。

4.3、在某些系统上会出现LoadLibrary加载dll库失败的问题,需要使用LoadLibraryEx接口

       我们在项目中遇到过几次使用LoadLibrary加载dll库失败的问题,dll库的路径是正确的(文件是存在的),但就是加载失败!当时深入研究了一下,参考Reactos开源系统中的regsvr32.exe中加载dll库的源码实现,将LoadLibrary改成了LoadLibraryEx,并传入LOAD_WITH_ALTERED_SEARCH_PATH参数。

4.4、使用Dependency Walker工具查看dll库的依赖关系以及调用的接口

       对于上述dll依赖的库问题,无论是依赖的库找不到,还是调用的接口在下层库中找不到,直接使用Dependency Walker工具打开这个问题dll查看即可找到问题。

       关于使用Dependency Walker查看库的依赖关系排查问题的项目问题实战分析案例,可以查看我之前写的文章:
使用Process Explorer和Dependency Walker排查C++程序中dll库动态加载失败问题icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140731158使用Dependency Walker和Process Explorer排查瑞芯微工具软件RKPQTool.exe启动报错的问题icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140731614使用Process Explorer和Dependency Walker排查dll动态库没法调试的问题(dll库加载失败导致没法动态调试)icon-default.png?t=O83Ahttps://blog.csdn.net/chenlycly/article/details/140803687

5、最后

       本文根据多年的项目实战经验,对dll库加载失败导致程序启动报错以及dll库加载失败的常见原因进行了总结,有一定的实战参考价值。本文的内容不仅对开发新人有用,这些内容很多有若干年开发经验的人可能也不太了解(他们对系统特性不太了解),对这些人可能也很有用。

相关文章:

dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结

目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…...

SAP MM学习笔记 - 豆知识10 - OMSY 初期化会计期间,ABAP调用MMPV/MMRV来批量更新会计期间(TODO)

之前用MMRV,MMPV来一次一个月来修改会计期间。 如果是老的测试机,可能是10几年前的,一次1个月,更新到当前期间,搞个100多次,手都抖。 SAP MM学习笔记 - 错误 M7053 - Posting only possible in periods 2…...

Pytorch实现RNN实验

一、实验要求 用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。 二、实验目的 理解循环神经网络(RNN)的基本原理:通过构建一个基于RNN的诗歌生成模型,学会RNN是如何处理序列数据的,以及如何在…...

四、Drf认证组件

四、Drf认证组件 4.1 快速使用 from django.shortcuts import render,HttpResponse from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.authentication import BaseAuthentication from rest_framework.exception…...

C++:静态成员

静态成员涉及到的关键字尾static 静态成员变量要在类外初始化 去掉static关键字类型类名::变量名 静态成员变量不属于任何对象 所有对象共享一份 静态成员可以不通过对象直接访问 类名::成员名 静态成员依旧受访问修饰符的约束 …...

28 Vue3之搭建公司级项目规范

可以看到保存的时候ref这行被提到了最前面的一行 要求内置库放在组件的前面称为auto fix,数组new arry改成了字面量,这就是我们配置的规范 js规范使用的是airbnb规范模块使用的是antfu 组合prettier&eslint airbnb规范: https://github…...

【pytorch】张量求导3

再接上文,补一下作者未补完的矩阵运算的坑。 首先贴一下原作者的图,将其转化为如下代码: import torch import torch.nn as nn import torch.optim as optim# 定义一个简单的两层神经网络 class TwoLayerNet(nn.Module):def __init__(self):super(TwoLayerNet, self).__in…...

Servlet——springMvc底层原理

我们也先了解一下什么的动态资源,什么是静态资源。 静态资源:无需程序运行就可以获取的资源(照片、html、css、js等) 动态资源:需要通关程序运行才可以获得的资源。 (其实动态、静态的资源都与Servlet有…...

Json 在线可视化工具,分享几个

文章目录 1.json.cn2.json4u.cn3.jsonvisual.com4.jsoncrack5.altearius.github.io6.json.wanvb.com 前序:本文是对多种 Json 在线可视化工具 的介绍、分享。Json官网 https://www.json.org/json-en.html 个人比较中意第四款: https://jsoncrack.com/ed…...

LLM | llama.cpp 安装使用(支持CPU、Metal及CUDA的单卡/多卡推理)

1. 详细步骤 1.1 安装 cuda 等 nvidia 依赖(非CUDA环境运行可跳过) # 以 CUDA Toolkit 12.4: Ubuntu-22.04/24.04(x86_64) 为例,注意区分 WSL 和 Ubuntu,详见 https://developer.nvidia.com/cuda-12-4-1-download-archive?targ…...

矩阵求解复数(aniwoth求解串扰)

所以这种求解串扰的格式是因为,有串扰的共轭项在方程组中 复数共轭项的作用,但是这是二次方程,...

Redis: Sentinel哨兵监控架构及环境搭建

概述 在主从模式下,我们通过从节点只读模式提高了系统的并发能力并发不断增加,只需要扩展从节点即可,只要主从服务器之间,网络连接正常主服务器就会将写入自己的数据同步更新给从服务器,从而保证主从服务器的数据相同…...

C++ 语言特性30 - 模板介绍

目录 一:C11 之前的模板特性 1. 函数模板: 2. 类模板: 3. 模板特化: 4. 模板参数: 5. 模板元编程: 二:C11的模板特性 1. 变长模板(Variadic Templates)&#xff…...

算法笔记(七)——哈希表

文章目录 两数之和判定是否互为字符重排存在重复元素存在重复元素 II字母异位词分组 哈希表:一种存储数据的容器; 可以快速查找某个元素,时间复杂度O(1); 当频繁查找某一个数时,我们可以使用哈希表 创建一个容器&#…...

【基础算法总结】链表篇

目录 一, 链表常用技巧和操作总结二,算法原理和代码实现2.两数相加24.两两交换链表中的节点143.重排链表23.合并k个升序链表25.k个一组翻转链表 三,算法总结 一, 链表常用技巧和操作总结 有关链表的算法题也是一类常见并且经典的题…...

探索路由器静态IP的获取方式

在网络配置中,路由器静态IP是一个重要的概念。对于家庭网络或办公室网络而言,正确配置静态IP地址是确保网络稳定性和管理的关键步骤之一。但是,很多人对于静态IP地址的获取方式可能感到困惑。在本文中,我们将探讨它的获取途径&…...

Vivado - JTAG to AXI Master (GPIO、IIC、HLS_IP)

目录 1. 简介 2. JTAG to AXI Master 2.1 添加 IP Core 2.2 基本TCL命令 2.2.1 复位 JTAG-to-AXI Master 2.2.2 创建并运行写入传输事务 2.2.3 创建并运行读取传输事务 2.2.4 命令列表 2.3 帮助信息 2.4 创建TCL读写程序 2.4.1 Read proc 2.4.2 Write proc 2.4.3 …...

Java中JWT(JSON Web Token)的运用

目录 1. JWT的结构2. JWT的优点3. JWT的流转过程4.具体案例一、项目结构二、依赖配置三、用户模型四、JWT工具类五、JWT请求过滤器六、安全配置七、身份验证控制器八、测试JWT JWT(JSON Web Token)是一种开放标准(RFC 7519)&#…...

CSS3练习--电商web

免责声明:本文仅做分享! 目录 小练--小兔鲜儿 目录构建 SEO 三大标签 Favicon 图标 布局网页 版心 快捷导航(shortcut) 头部(header) logo 导航 搜索 购物车 底部(footer&#xff0…...

Linux 默认内核版本更改

随笔记录 目录 1. 背景介绍 2. 解决方法 2.1 查看所有可用版本 2.2 安装指定版本内核 2.3 检查当前内核列表 2.4 检查当前默认内核 2.5 设置新的默认内核 2.6 确认内核是否成功加载 2.7 重启 2.8 删除其他版本内核 1. 背景介绍 linux 一般安装多个内核版本&…...

【ubuntu】修改用户名、主机名、主文件夹名、登录名、密码

目录 1.他们是什么 2.修改方法 2.1 修改用户密码 2.2 修改主机名 2.2.1 切换到root用户 2.2.2 修改名称 2.3 修改用户名 主文件夹名 登录名 2.2.1 sudoers 2.2.2 passwd 2.2.3 shadow 2.2.4 group 2.2.5 修改主文件夹名 3.重启 1.他们是什么 (1&#xf…...

深入理解JavaScript 的原型继承

JavaScript 的原型链继承机制和 Java 的类继承机制有明显的区别,虽然它们都用于实现对象之间的继承,但它们的实现方式、概念以及运行机制都不同。 1. JavaScript 的原型继承 JavaScript 是基于原型链的继承,主要依赖对象的 __proto__ 属性或…...

Error while loading conda entry point: conda-libmamba-solver

问题 解决方法 conda install --solverclassic conda-forge::conda-libmamba-solver conda-forge::libmamba conda-forge::libmambapy conda-forge::libarchive...

FANUC机器人—PCDK

前言 FANUC提供了一种使用其 PC 开发人员套件 (PCDK) 从 PC 命令和配置机器人的简单方法。该套件允许 PC 访问机器人上的变量、寄存器、IO、程序、位置和警报;接下来,我将如何开始使用 C#。 连接到机器人 将以下突出显示的行添加…...

如何在wsl中使用beyond compare

寫一個名為bc4的文件,內容如下: #!/bin/sh /mnt/c/Program\ Files/Beyond\ Compare\ 4/BComp.com $(wslpath -aw $1) $(wslpath -aw $2)bc4 file1 file2參考:https://forum.scootersoftware.com/forum/beyond-compare-4-discussion/version-…...

CNN+Transformer在自然语言处理中的具体应用

在自然语言处理(NLP)领域,CNN(卷积神经网络)和Transformer架构各自有着广泛的应用。NLP中的具体应用: CNN在NLP中的应用 1.文本分类:CNN可以用于文本分类任务,如情感分析、垃圾邮件…...

DotNetty ChannelRead接收数据为null

问题:C#使用Dotnetty和Java netty服务器通讯,结果能正确发送数据到服务器,却始终接收不到服务器返回的数据。 解决:一定一定要注意服务器和客户端使用的编码一定要完全一样才行 我先前在客户端添加了StringDecoder,服务器却没有…...

3分钟学会下载 blender

1. blender简介 Blender是一款开源的3D创作套件,它由Blender Foundation维护,并得到了全球志愿者和专业开发者的支持。Blender广泛应用于3D模型的制作、动画、渲染、视频编辑、游戏创建、模拟、 composting以及3D打印等多个领域。 功能特点&#xff1a…...

实现Xshell与虚拟机中Linux服务器的连接(附常见错误解决)

前言 Xshell是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 本文将介绍Xshell与虚拟机中Linux服务器连接…...

Rust 语言开发 ESP32C3 并在 Wokwi 电子模拟器上运行(esp-hal 非标准库、LCD1602、I2C)

文章目录 esp-rs 简介GithubRust 包仓库Rust 教程Wokwi 电子模拟器开发环境Rust 环境esp-rs 环境创建 ESP32C3 项目项目结构编译项目命令运行模拟器ESP32C3 烧录 esp-rs 简介 esp-rs 是一个专注于为 Espressif 系列芯片(如 ESP32、ESP32-S2、ESP32-C3 等&#xff0…...