gpt4 book ai didi

c++ - 为什么构建没有预编译头文件的 DLL 在使用时会出现奇怪的错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:11 24 4
gpt4 key购买 nike

总结:今天我发现在构建一个没有预编译头文件的 DLL 时,当您尝试使用它时会出现一个奇怪的错误。

当禁用预编译 header 时,构建 DLL 会很顺利。但是,一旦附加了 DLL(编译时或运行时),它就会导致错误“参数无效”。两种情况的实际错误代码都不同。附加编译时时会弹出错误代码为 0xc000000d 的对话框,调用 LoadLibrary() 时会返回 NULL 指针,而 GetLastError() 会返回0x57.

编辑:

我发现当增量链接被禁用时问题就消失了。在运行附加到 DLL 编译时的客户端时,我以某种方式错过了 Visual Studio 显示的以下错误:

'TestClient.exe': Loaded 'D:\Projects\PchDllTest2\Debug\TestClient.exe', Symbols loaded.
'TestClient.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Cannot find or open the PDB file
'TestClient.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Cannot find or open the PDB file
'TestClient.exe': Loaded 'D:\Projects\PchDllTest2\Debug\TestDll.dll', Symbols loaded.
SXS: RtlCreateActivationContext() failed 0xc000000d
LDR: LdrpWalkImportDescriptor() failed to probe D:\Projects\PchDllTest2\Debug\TestDll.dll for its manifest, ntstatus 0xc000000d
Debugger:: An unhandled non-continuable exception was thrown during process load
The program '[5292] TestClient.exe: Native' has exited with code -1073741811 (0xc000000d).

根据要求,函数声明:

#ifdef __cplusplus
extern "C" {
#endif

MYTEST_API int MyTestFoo(int a);

#ifdef __cplusplus
}
#endif

有一点值得注意:当您使用向导(新建项目 -> Visual C++ -> Win32 -> Win32 项目)创建新的 DLL 时,向导会强制您在选择时使用预编译头文件DLL 作为应用程序类型。 请参阅 ta.speot.is 的回答。

我彻底改变了这个问题,因为它首先看起来像是我认为它以某种方式记录了 DLL 项目需要 PCH。事实并非如此,这可能是一种奇怪的错误(希望不是)或者我可能正在做一些非常愚蠢的事情......

最佳答案

Why are precompiled headers required when building a DLL?

他们不是。

In summary: Today I discovered that it's not possible to make a (functioning) DLL without building it with precompiled headers. Does anyone know what the reason is for this?

发现这个的原因是你误读了一些东西。

您可以制作没有预编译头文件的二进制文件。

There's one thing that is remarkable about this: When you create a new DLL using a wizard (New project -> Visual C++ -> Win32 -> Win32 Project), the wizard forces you to use precompiled headers when selecting DLL as application type.

也许在 Visual C++ 6 中,但我使用 Visual Studio 的经验表明情况并非如此。如果您使用向导创建一个空项目,您不会获得预编译头文件。

Wizard

除此之外,我在 Google 上查看了“其 list ,ntstatus 0xc000000d”,最终我结束了 here .最后一个答案表明您的 CRT 版本不匹配,如果您让 Visual Studio 为您创建项目并坚持使用默认值,这将很难做到。

在您的“主机”应用程序和库中检查您是否链接到相同版本的 CRT 可能是值得的(例如,两者都是多线程调试)。

我唯一能想到的另一件事是,您将 TestDll.dll 移动到 Debug 文件夹中,而没有随附 TestDll.dll.manifest 文件(如果有的话)。

关于c++ - 为什么构建没有预编译头文件的 DLL 在使用时会出现奇怪的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12133861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com