Лучшая книга по этой теме Руководство Методологии Повторного использования. Это покрывает и VHDL и Verilog.
И в особенности некоторые проблемы, которые не имеют точного совпадения в программном обеспечении:
Некоторые, которые являются тем же, включают
Интересно, можно ли отладить его, когда он работает как служба. Должно быть что-то пугает вашу программу, когда ее запускает хост службы. Возможно, попробуйте подключить отладчик к svchost.exe, по крайней мере, вы сможете увидеть, какие модули загружены и, возможно, какое исключение вызывает сбой.
Я подозреваю - mthreads приводит к зависимости от DLL, и эта DLL не находится на пути, когда она работает как служба. В моей среде cygwin, если я компилирую тривиальную программу с помощью «-mno-cygwin -mthreads», я получаю зависимость от MINGWM10.DLL, которая, конечно, не будет на пути при работе в качестве службы. Если я попытаюсь запустить его без установленного PATH, он выйдет из строя при начале загрузки (и оставит какашку в журнале событий приложений).
Я бы поднял ваш exe в Dependency Walker ( http: / /www.dependencywalker.com), чтобы увидеть, что вы загружаете во время загрузки, и проверьте свой журнал событий Windows, чтобы увидеть, есть ли там какие-либо подсказки. Вероятно, вам понадобится поместить копию необходимых ей DLL вместе с исполняемым файлом.
Is your application even starting up at all? Put a call to OutputDebugString
(or equivalent) at the start of your main
function to see if it even gets that far. (Grab DbgView
from SysInternals if you don't have it already.)
If it doesn't get that far, we start checking for the obvious: is it a matter of the application not finding the runtime DLL? It could be that you have the regular runtime in its PATH, but it can't find the MT version. That could explain the behaviour you describe. You may need to copy the MT runtime or update the PATH accordingly.
Вы требуется mingwm10.dll в рабочем каталоге или в [edit: system, not per user] PATH, потому что программы C ++, скомпилированные с параметром -mthread, имеют эту зависимость. Если вы уверены, что исключение никогда не будет создано вашим кодом и не будет распространяться через ваш стек, используйте -fno-exception вместо -mthread для разрешения зависимости.