Почему при компиляции без -static расширение Game Maker, скомпилированное mingw, вылетает при выходе? - PullRequest
3 голосов
/ 14 мая 2011

Я скомпилирую DLL с mingw 4.5.0 и использую ее как расширение Game Maker 8.0. Game Maker динамически загружает DLL. Кажется, все работает (функции dll вызываются и обеспечивают правильные возвращаемые значения), но когда я закрываю Game Maker, появляется диалоговое окно: «Библиотека времени выполнения Microsoft Visual C ++», «Это приложение запросило завершение работы среды необычным способом. " После этого процесс продолжается в течение нескольких секунд в фоновом режиме, а затем исчезает.

Это также происходит, когда на самом деле не вызывается ни одна из функций dll. Нет DllMain, и все статические / глобальные переменные являются базовыми типами данных или std::string (на самом деле это также происходит при удалении std :: strings).

DLL статически связывается с zlib и libpng. Проблема, кажется, исчезает, когда я передаю -static компоновщику, который (я полагаю) также статически связывает среду выполнения. Однако это значительно увеличивает размер моей DLL, и в лучшем случае это обходной путь, пока я не пойму, что происходит.

Есть идеи о том, что может быть причиной?

Обновление : На самом деле, похоже, что проблема возникает только тогда, когда в Game Maker загружены два экстента: один с dll, связанным с -static, а другой без. Соединение обоих без -static делает проблему исчезающей. Тем не менее, я до сих пор не понимаю проблему, потому что библиотеки никогда не взаимодействуют напрямую и не разделяют структуры данных.

Обновление 2 : Недавно я обнаружил, что это может быть связано со странным поведением самого Game Maker. Кажется, что глобальные переменные не инициализируются правильно при загрузке DLL, что может вызвать сбой при выгрузке, если глобальные объекты пытаются освободить память, которой они не владеют. Это означало бы, что -static был случайным фактором, который изменял значение неинициализированной памяти, с которой ассоциировались глобалы.

Обновление 3 : изменено выше, чтобы включить информацию о расширениях Game Maker, поскольку это, вероятно, относится к Обновлению 2.

1 Ответ

0 голосов
/ 29 января 2012

Это всего лишь предположение.Попробуйте посмотреть что-то вроде «фиаско статического порядка инициализации», описанного здесь .Возможно, ваша проблема в большей степени связана с деструкторами (поскольку это происходит при закрытии).

...