gpt4 book ai didi

c++ - 需要 dll 入口点问题/建议

转载 作者:可可西里 更新时间:2023-11-01 09:21:40 27 4
gpt4 key购买 nike

我有一个跨平台的 C++ 代码动态库,主要是 native C++。然后我从我的主 exe 使用这个动态库。到目前为止,在使用 gcc 的 OSX 上一切都很好。现在我在 Windows 上,我对应该使用什么方法进入 dll 感到困惑。我目前没有 DllMain 函数,因为这在 gcc 中不是必需的(据我所知)。我的初始测试有效,但检查后发现奇怪的是我的一个类构造函数在 dll 加载时被调用,所以我认为我需要在 Windows 上做更多的事情。我也是:

  • 添加 DllMain 函数?
  • 仅使用 noentry 编译器选项是否安全?

当我执行上述任一操作时,我开始收到编译器提示“.CRT 部分存在,可能存在未处理的静态初始值设定项或终止符”

我已经使用这个 article 阅读了相关内容,但我们将不胜感激任何关于最佳前进方向的建议和澄清。关于我需要做什么,我的脑子里有点模糊。

最佳答案

根据 .CRT 错误,您肯定需要 DllMain 函数。对于大多数 Windows 编译器,会自动为您提供一个 DllMain,因此您无需自己编写。根据您问题的其他部分,您似乎最有可能使用的是 Visual C++,其 CRT 确实为您提供了 DllMain。因此,虽然您确实需要 DllMain,但无需为其编写代码。

默认的 VC CRT DllMain 用于为有问题的 DLL 初始化 CRT,并初始化 dll 提供的所有静态/全局变量。

Unix 和 Windows 上的 DLL 模型明显不同,您应该将每个 DLL 视为具有更“私有(private)”的状态集。不过,如果所有 Dll 选择使用相同版本的 CRT dll,那么该状态的某些部分将被共享。

因为 CRT 正在为您提供 DllMain,所以您不应该在链接器上抛出/noentry。

.CRT 部分存在错误(您一定已经通过抛出/noentry 看到了)告诉您需要一个 DllMain,因为您的 DLL 中有一个或多个对象需要静态初始化。

马丁

关于c++ - 需要 dll 入口点问题/建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656426/

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