动态库dlllink连接失败(dll编译部分成员函数link失败)

本文目录
- dll编译部分成员函数link失败
- 无法连接动态链接库
- DLL调用LINK出错
- 电脑里的动态连接库是什么意思如果打开文件经常与它连接不上是什么回事该怎么办
- 为什么我加载动态链接库失败了,路径绝对没有错错
- 动态链接库(DLL)初始化例程失败
- 求助求助,动态链接库(DLL)初始化例程失败
- 动态链接库引导失败怎么办
dll编译部分成员函数link失败
错误 1 error LNK2019: 无法解析的外部符号 "bool __cdecl sinstk::CmpINS2GPS(class std::basic_string《char,struct std::char_traits《char》,class std::allocator《char》 》,class std::basic_string《char,struct std::char_traits《char》,class std::allocator《char》 》,double * const)" (?CmpINS2GPS@sinstk@@YA_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@0QAN@Z),该符号在函数 "void __cdecl main_sins(void)" (?main_sins@@YAXXZ) 中被引用 J:\PVAProject(代码修改原始)\PVAProject\SINStkProject.obj PVADLL
错误 2 error LNK1120: 1 个无法解析的外部命令 J:\PVAProject(代码修改原始)\Debug\PVADLL.exe 1 1 PVADLL
毫无疑问,这里是调用动态库时出现了问题。结合网上已经有网友提出的解决方案,这里汇总一下当出现上述问题时可以对照代码查看以下问题:
生成DLL文件的字符集是Unicode而生成exe文件的字符集为默认的ASCIl。
只要统一字符集即可解决问题:
在项目属性-》配置属性–》常规-》项目默认值-》字符集中设置字符集即可。
但是,从实际情况来看,使用多字节字符不影响最后DLL的使用。
调用
既然是调用动态库,就需要查看导入库的设置是否正确。
一般来说,对于VS需要配置3个属性:
属性-》配置属性-》C/C++-》常规-》附加包含目录加入所有.h所在的路径(即动态库的*.h文件)
属性-》配置属性-》链接器-》常规-》附加库目录(所生成的*.lib文件路径)
属性-》配置属性-》链接器-》输入-》附加依赖项(*.lib文件的全名)
一般情况下,.lib文件和.exe文件需要放置在同一目录。
头文件
程序中使用库中的函数时需要包含其头文件。尽量不要包含中文路径,特别是本工程的名字,之前遇到这样的错误就是因为中文路径的问题造成的。
无法连接动态链接库
重新安装
输入“regsvr32
“开始”----》“运行”-------》输入“regsvr32 /s dernel32.dll”,此时该动态链接库文件自动与系统注册。
DLL调用LINK出错
用VC中的lib命令从dll中导出lib文件 ,然后#pragma导出来的lib文件,编译即可。
至于unresolved external symbol错误,这是由于编译后函数名字改变的原因,因为编译后C和C++命名规则不一样,所以连接时候就找不到函数。
你用dump命令看一下dll文件中导出的函数名是什么。要是C写的dll声明函数时候加上,extern "C"即可。
电脑里的动态连接库是什么意思如果打开文件经常与它连接不上是什么回事该怎么办
一. 什么是动态连接库
动态连接库使用标准的PE文件格式,在动态连接库里可以定义资源并使用各种资源,并且可以导入并使用其它动态连接库里定义的函数(动态连接库嵌套)。它提供函数给其它程序在运行的时候调用。通常动态连接库文件的扩展名是.dll,但是系统中某些exe文件,字体文件.fon,一些驱动程序.drv,各种控件.ocx和输入法模块ime等都是动态连接库。
二. 动态连接库框架
;--------------------------------------------------------------------------------------
;DLLSkeleton.asm
;--------------------------------------------------------------------------------------
.386
.modelflat,stdcall
optioncasemap:none
include\masm32\include\windows.inc
include\masm32\include\user32.inc
include\masm32\include\kernel32.inc
includelib\masm32\lib\user32.lib
includelib\masm32\lib\kernel32.lib
.data
.code
DllEntryprochInstDLL:HINSTANCE,reasonWORD,reserved1WORD
moveax,TRUE
ret
DllEntryEndp
;---------------------------------------------------------------------------------------------------
;下面是一个空函数,您可以象下面一样插入您的函数。
;----------------------------------------------------------------------------------------------------
TestFunctionproc
ret
TestFunctionendp
EndDllEntry
;-------------------------------------------------------------------------------------
;DLLSkeleton.def
;-------------------------------------------------------------------------------------
LIBRARYDLLSkeleton
EXPORTSTestFunction
1入口点和初始化代码
DllEntryprochInstDLL:HINSTANCE,reasonWORD,reserved1WORD
moveax,TRUE
ret
DllEntryEndp
每一个动态连接库必须有一个入口函数,以方便操作系统使用。(注意入口函数对调用的应用程序是透明的)函数的名称是什么没有特定的要求,但是格式是有规定的。看看什么情况下要用到入口函数:
■当动态链接库被加载时
■当动态链接库卸载时
■同一进程的线程生成时
■同一进程的线程退出时
hInstDLL是该动态链接库模块的句柄。它和进程的实例句柄不一样。如果您以后要用,可以保存它,因为以后再要获得它不容易。
根据不同的时机,reason传入的值可能是下面的四个值中的一个:
DLL_PROCESS_ATTACH动态链接库第一次插入进程的地址空间时。当传入的参数是该值时,可以做一些初始化的工作。
DLL_PROCESS_DETACH动态链接库从进程的地址空间卸出时。可以在此做一些清理的工作。譬如:释放内存等。
DLL_THREAD_ATTACH新线程生成。
DLL_THREAD_DETACH线程销毁。
如果想要库中的代码继续执行,返回TRUE,否则返回FALSE,那样动态链接库就不会加载了。譬如:想分配一块内存,如果不成功的话就退出,这时就可以返回FALSE。那样动态链接库就不会加载了。可以加入的函数,它们的位置并不重要,把它们放在入口点函数的前面或后面都可以。只是如果您想要它们能被其它的程序调用的话,就必须把它们的名字放到模块定义文件(.def)中去。
动态链接库在它们自己的编译过程就需要,而不只是提供给其它要引用它的程序参考。它们如下:
LIBRARYDLLSkeleton
EXPORTSTestFunction
第一行是必须的。LIBRARY定义了DLL的模块名称。它必须和动态链接库的名称相同。
EXPORTS关键字告诉链接器该DLL的引出函数,也就是其它程序可以调用的函数。举个例子:其它的程序想要调用函数TestFunction,我们就把它放到EXPORTS中。
2链接选项
链接器的选项中必须放入开关项:/DLL和/DEF,就像下面这样:
link/DLL/SUBSYSTEM:WINDOWS/DEFLLSkeleton.def/LIBPATH:c:\masm32\libDLLSkeleton.obj
编译器的开关选项是一样的,即:/c/coff/Cp。在链接好后,链接器会生成.lib和.dll文件。前者是引入库,当其它的程序要调用自己的动态链接库中的函数时就需要该引入库,以便把必要的信息加入到其可执行文件中去。
三. 动态连接库的调用方法
1在include文件定义的时候包含动态连接库的.rc和.lib库文件,在程序中直接调用动态连接库里的函数
2动态加载所需的DLL。
那我们该如何解决这个问题呢?
在Windows中提供了两个函数LoadLibrary和GetProcAddress,LoadLibrary函数用来动态加载DLL,而GetProcAddress函数用来从某个DLL中获取指定函数的地址。这两个函数的用法如下:
HINSTANCELoadLibrary(
LPCTSTRlpLibFileName//addressoffilenameofexecutablemodule
);
FARPROCGetProcAddress(
HMODULEhModule,//handletoDLLmodule
LPCSTRlpProcName//nameoffunction
);
LoadLibarary函数用来加载一个DLL模块,如果成功,则返回该模块的句柄。这个句柄可以用于GetProcAddress函数。而GetProcAddress函数则从DLL模块中查找特定函数名的函数的地址。例如下面两句代码就是从kernel32.dll中取得CreateProcess函数的地址:
HMODULE hModule=LoadLibrary(“kernel32.dll”);
FARPROC *fn=GetProcAddress(hModule,”CreatePrcess”)
但现在又出现了一个问题,函数LoadLibrary和GetProcAddress的地址又从哪得到呢?这就像一个现有鸡还是先有蛋的问题一样。
在WinNT中,进程的环境块(PEB)地址总是在0x7FFDF000处。而在PEB中由该进程加载的每个DLL的地址,当然包括Kernel32.dll的地址。找到Kernel32.dll的地址之后,就可以通过Kernel32.dll的PE文件头找到其导出函数表,再查找该导出函数表就可以找到函数“GetProcAddress”的地址,之后就可以通过GetProcAddress函数得到“LoadLibrary”的地址了。
完成这个功能的Win32汇编代码给出。
;**************************************************************************
;*下面这部分汇编需要对PEB结构非常的了解
;**************************************************************************
mov eax,7FFDF00Ch
;7FFDF000的位置是PEB的位置,其偏移0x0C(即7FFDF00Ch)是PEB_LDR_DATA结构
mov eax,dwordptr
mov esi,dwordptr
;在PEB_LDR_DATA+0x1c地方就是一些动态连接库的地址了,如第一个指向ntdll.dll
;第二个就是我们需要的kernel32.dll的地址,第三个是msvcrt.dll,一个指针链表
lodsd
mov eax,dwordptr
;此时得到了Kernel32.dll的位置,eax等于77E60000
mov ,eax
;此时hModule等于kernel32.dll的位置,即77E60000
;********************************************************************
;从PE文件头的数据目录获取导出表地址
;********************************************************************
mov esi,
add esi,
assume esitrIMAGE_NT_HEADERS
mov esi,.OptionalHeader.DataDirectory.VirtualAddress
add esi,
assume esitrIMAGE_EXPORT_DIRECTORY
;esi指向kernel。dll的导出表
;********************************************************************
;查找符合名称的导出函数名
;********************************************************************
mov eax,.AddressOfNames
add eax,
xor edx,edx
.repeat
push esi
mov edi,
add edi,
lea esi,
mov ecx,14
repz cmpsb
.if ZERO?
pop esi
jmp @F
.endif
pop esi
add eax,4
inc edx
.until edx》= .NumberOfNames
jmp return
@@:
;********************************************************************
;API名称索引--》序号索引--》地址索引
;********************************************************************
sub eax,.AddressOfNames
sub eax,
shr eax,1
add eax,.AddressOfNameOrdinals
add eax,
movzx edx,wordptr
shl edx,2
add edx,.AddressOfFunctions
add edx,
;********************************************************************
;从地址表得到导出函数地址
;********************************************************************
mov eax,
add eax,
;取得GetProcAddress函数的地址
mov ,eax
;取得LoadLibrary函数的地址
lea esi,
_invoke ,esi
mov ,eax
assume esi:nothing
为什么我加载动态链接库失败了,路径绝对没有错错
这样的问题是比较常见系统问题,在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:WindowsSystem目录下。所以有时候当你删除一个软件的,有可能把其它程序需要调用的dll文件也给删除了,造成的结果结果你是你看到的显现,如果你能确定其名称,可以在Sysbckup(系统备份文件夹)中找到该DLL文件,将其复制到System文件夹中。如果这样不行,在电脑启动时又总是出现“***dll文件丢失……”的提示框,你可以在“开始/运行”中运行Msconfig,进入系统配置实用程序对话框以后,单击选择“System.ini”标签,找出提示丢失的DLL文件,使其不被选中,这样开机时就不会出现错误提示了。最后的办法只好重新安装系统,这样的你的博克一定会正常的!
动态链接库(DLL)初始化例程失败
DLL是Dynamic Link Library的缩写gjl意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件3951它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:\Windows\System目录下 1、如何了解某应用程序使用哪些DLL文件 右键单击该应用程序并选择快捷菜单中的“快速查看”命令nr在随后出现的“快速查看”窗口的“引入表”一栏中你将看到其使用DLL文件的情况。 2、如何知道DLL文件被几个程序使用 运行Regedit进入HKEY_LOCAL_MACHINE\Software\Microsrft\Windows\Current-Version\SharedDlls子键查看,其右边窗口中就显示了所有DLL文件及其相关数据,其中数据右边小括号内的数字就说明了被几个程序使用,(2)表示被两个程序使用,(0)则表示无程序使用,可以将其删除 3、如何解决DLL文件丢失的情况 有时在卸载文件时会提醒你删除某个DLL文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的DLL文件。一旦出现了丢失DLL文件的情况,如果你能确定其名称,可以在Sysbckup(系统备份文件夹)中找到该DLL文件,将其复制到System文件夹中。如果这样不行,在电脑启动时又总是出现“***dll文件丢失……”的提示框,你可以在“开始/运行”中运行Msconfig,进入系统配置实用程序对话框以后,单击选择“System.ini”标签,找出提示丢失的DLL文件,使其不被选中,这样开机时就不会出现错误提示了
求助求助,动态链接库(DLL)初始化例程失败
DLL是Dynamic Link Library的缩写,意为动态链接库。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的DLL文件被称为共享DLL文件。DLL文件一般被存放在C:\Windows\System目录下。
1、如何了解某应用程序使用哪些DLL文件
右键单击该应用程序并选择快捷菜单中的“快速查看”命令,在随后出现的“快速查看”窗口的“引入表”一栏中你将看到其使用DLL文件的情况。
2、如何知道DLL文件被几个程序使用
运行Regedit,进入HKEY_LOCAL_MACHINE\Software\Microsrft\Windows\Current-Version\SharedDlls子键查看,其右边窗口中就显示了所有DLL文件及其相关数据,其中数据右边小括号内的数字就说明了被几个程序使用,(2)表示被两个程序使用,(0)则表示无程序使用,可以将其删除。
3、如何解决DLL文件丢失的情况
有时在卸载文件时会提醒你删除某个DLL文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的DLL文件。一旦出现了丢失DLL文件的情况,如果你能确定其名称,可以在Sysbckup(系统备份文件夹)中找到该DLL文件,将其复制到System文件夹中。如果这样不行,在电脑启动时又总是出现“***dll文件丢失……”的提示框,你可以在“开始/运行”中运行Msconfig,进入系统配置实用程序对话框以后,单击选择“System.ini”标签,找出提示丢失的DLL文件,使其不被选中,这样开机时就不会出现错误提示了。
动态链接库引导失败怎么办
可能是你那个DLL文件丢失了,你最好重庆安装,因为如果你重新拷贝一个进去的话,不会对这个DLL自动进行注册,那样可能你的程序还是无法运行。
所以建议你重新安装,或者可以修复程序。

更多文章:
force-unicode-font是什么意思?ღ᭄ꦿ这些特殊字是怎么来的
2026年9月27日 23:50
java重载和覆盖的定义(java中方法重载和重写的区别和定义)
2026年9月27日 22:50
变幻金刚魔方教程图解(变幻金刚魔方的最后一步,研究了很长时间就是搞不 出来,能教教我吗)
2026年9月27日 21:00
怎样使用dreamweaver(怎么用dreamweaver制作网页如何用dreamweaver制作网页)
2026年9月27日 20:40
css提交按钮怎么写(html:submit能加css样式吗)
2026年9月27日 19:20
雨崩近年危险事件调查(下雨好长时间了,去雨崩的路况怎么样有刚从雨崩回来的吗)
2026年9月27日 13:20
shell脚本substr(SHELL脚本对LINUX下指定文本文件的满足条件的行的特定位置字符串进行替换)
2026年9月27日 10:50





