我有一个动态的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/

    10-11 02:37