如何确保我的exe文件能够识别我的dll文件,该文件位于与我的exe文件相邻的名为binary的文件夹中

问题描述 投票:0回答:1

编译器生成的日志输出

'FpsKing.exe' (Win32): Loaded 'C:\Users\user\source\repos\FirstPersonShooter\x64\Debug\FpsKing.exe'. Symbols loaded.
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\KernelBase.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\user32.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\win32u.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\gdi32.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\gdi32full.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\msvcp_win.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\ucrtbase.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Visual studio\cpp\lib\SFML\bin\sfml-graphics-d-2.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\msvcrt.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Visual studio\cpp\lib\SFML\bin\sfml-window-d-2.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\advapi32.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\sechost.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\bcrypt.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\rpcrt4.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Visual studio\cpp\lib\SFML\bin\sfml-system-d-2.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\msvcp140d.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\vcruntime140d.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\vcruntime140_1d.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\ucrtbased.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Program Files\gnuplot\bin\libgcc_s_seh-1.dll'. Module was built without symbols.
'FpsKing.exe' (Win32): Loaded 'C:\Program Files\gnuplot\bin\libstdc++-6.dll'. Module was built without symbols.
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\opengl32.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\combase.dll'. 
'FpsKing.exe' (Win32): Loaded 'C:\Windows\System32\winmm.dll'. 

列出的程序的文件夹结构

|
|-[my exe file]
|-binary
    └──[all my dll files]

尝试运行我的应用程序 (FpsKing.exe) 时遇到“找不到入口点”错误。该错误发生在我的应用程序中的任何代码执行之前,通过程序开头放置的断点进行了验证。

Exception thrown at 0x00007FFD1BE9F90D (ntdll.dll) in FpsKing.exe: 0xC0000139: Entry Point Not Found.
The thread 34924 has exited with code 3221225785 (0xc0000139).
The thread 30020 has exited with

 code 3221225785 (0xc0000139).
The program '[27764] FpsKing.exe' has exited with code 3221225785 (0xc0000139) 'Entry Point Not Found'.

我正在尝试动态加载 DLL 并在清单文件中指定了它们的位置。清单文件应引导应用程序找到 DLL,就好像它们与可执行文件位于同一目录中一样。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        version="1.0.0.0"
        processorArchitecture="*"
        name="FpsKing"
        type="win32"
    />
    <file name="binary\openal32.dll"/>
    <file name="binary\sfml-graphics-d-2.dll"/>
    <file name="binary\sfml-audio-d-2.dll"/>
    <file name="binary\sfml-network-d-2.dll"/>
    <file name="binary\sfml-system-d-2.dll"/>
    <file name="binary\sfml-window-d-2.dll"/>
</assembly>

当 dll 文件放在 exe 旁边时,应用程序可以完美加载 但是,将 DLL 放在二进制子目录中会导致找不到入口点错误

my linker with my lib files

有人建议需要系统环境,但我个人猜测是否可以使用清单文件来指向二进制文件夹中的dll文件,而不需要配置系统变量

假设清单文件会引导我的exe搜索dll? 或者我是一个巨大的虚拟人,在 Visual Studio 配置中静态链接并在我的代码中动态链接?

编辑:当 dll 文件与导致 exe 运行的 exe 相邻时,依赖关系遍历器显示错误,但我不希望 dll 相邻。虽然 dll 文件有一个红色图标,但当我的 exe 运行时,该图标不存在

这是由于找不到入口点而导致可执行文件无法运行时的照片:dependency walker

c++ visual-studio dll manifest subdirectory
1个回答
0
投票

感谢 https://medium.com/@onerecovery/full-guide-how-to-fix-entry-point-not-found-error-2023-cae1e205dfea

问题

入口点是软件或程序的入口点,可将某些资源上从操作系统到应用程序的进程控制权交给软件或程序。当您无法打开程序并显示错误消息“程序名称.exe - 未找到入口点”时,通常会出现“未找到入口点”错误消息。系统无法在所需的DLL(动态链接库)文件中找到该函数或过程,这表明某个进程中必需的文件丢失或损坏,导致程序无法启动。例如,当您打开Photoshop、iTunes、Chrome等时,系统找不到打开您应用程序大门的钥匙;密钥(移交该进程所需的文件)丢失、损坏或损坏。

The error

可能原因:

  • 病毒问题
  • 软件安装问题
  • 系统文件问题
  • 注册表问题
  • 磁盘驱动器错误
  • 驱动问题

如何解决这个问题?

首先,您需要查明 DLL 是否被感染或损坏,因此在安全计算机上检查它是否有病毒,如果没有被感染,则在那里测试该 DLL。如果有效,则说明您的系统出现了问题。如果它不起作用,那么您还有其他问题(并且您也可能有系统问题)。

要修复您的系统,请打开 cmd 并运行

sfc /scannow

仔细看

scannow
的结果,是否发现问题。重新启动您的计算机并再次测试您的 dll。

如果问题仍然存在,请尝试卸载并重新安装依赖项。

如果问题仍然存在,请从受信任的来源下载 DLL 并尝试使用它来代替您拥有的副本,确保版本正确。

确保您的驱动程序是最新的,或者它们与您的 DLL 版本兼容。

当然,您需要根除所有病毒并拥有新的病毒数据库,这是不言而喻的。

如果 DLL 之前可以工作,那么您可能会考虑将计算机恢复到之前的状态。

© www.soinside.com 2019 - 2024. All rights reserved.