我正在尝试使用 MingW 构建 Windows 服务。它需要线程安全异常,所以我添加了链接器标志-mthreads。该应用程序从命令行运行良好,但是当我尝试从services.msc启动它时,会引发 1054 错误(“服务未及时响应启动或控制请求”)。如果我在没有-mthreads标志的情况下重新构建它,服务就会启动。我怎样才能让它与-mthreads一起工作?
4 回答
我怀疑 -mthreads 引入了对 DLL 的依赖,并且当它作为服务运行时,该 DLL 不在路径上。在我的 cygwin 环境中,如果我用“-mno-cygwin -mthreads”编译一个简单的程序,我会依赖 MINGWM10.DLL,它在作为服务运行时肯定不会出现在路径上。如果我尝试在没有设置 PATH 的情况下运行它,它会在开始加载时崩溃(并在应用程序事件日志中留下一个粪便)。
我会在 Dependency Walker ( http://www.dependencywalker.com ) 中打开您的 exe,以查看您在加载时加载的内容,并检查您的 Windows 事件日志以查看是否有任何提示。您可能需要将所需的 DLL 副本与可执行文件放在一起。
您需要工作目录或 [edit: system, not per user] PATH 中的 mingwm10.dll,因为使用 -mthread 选项编译的 C++ 程序具有该依赖性。如果您非常确定您的代码永远不会抛出异常,也不会通过堆栈传播异常,请使用 -fno-exception 而不是 -mthread 来解决依赖关系。
您的应用程序是否已经启动?OutputDebugString
在函数的开头调用(或等效的),main
看看它是否能达到那么远。(如果您还没有,请DbgView
从SysInternals获取。)
如果没有那么远,我们开始检查显而易见的问题:是否是应用程序找不到运行时 DLL 的问题?可能是您在其 PATH 中有常规运行时,但找不到 MT 版本。这可以解释你描述的行为。您可能需要复制 MT 运行时或相应地更新 PATH。
我想知道您是否可以在它作为服务运行时对其进行调试。当服务主机运行它时,一定有一些东西吓到了你的程序。也许尝试将调试器附加到 svchost.exe,至少您可以看到加载了哪些模块以及可能导致崩溃的异常。