При каких обстоятельствах в Windows неинкрементное связывание может привести к исключению, а инкрементное связывание - нет? - PullRequest
0 голосов
/ 22 октября 2019

Я читал, что инкрементные и неинкрементные ссылки должны быть функционально эквивалентными, но недавно я обнаружил ситуацию, когда это не так, и это меня немного сбивает с толку. Это из-за того, что сборка моего проекта не может явно загрузить одну DLL (из многих), которая содержит элемент графического интерфейса wxWidgets во время выполнения без включенного инкрементного связывания (/ INCREMENTAL).

Чтобы дать небольшой контекст, я имеюСледующие цели построены моим проектом:

  • main.exe
  • core.dll
  • foo.dll
  • bar.dll

core.dll содержит общие функции, которые используются всеми другими проектами. main.exe - это настольное приложение с графическим интерфейсом (использующее wxWidgets), которое явно загружает foo.dll и bar.dll во время выполнения через «LoadLibraryW». Затем «GetProcAddress» используется для запроса отображения элементов графического интерфейса из библиотек DLL, что выполняется асинхронно через wxEvent. Это сработало, как задумано, по большей части. Тем не менее, я обнаружил, что проблема возникает, когда main.exe не инкрементно связан.

В частности, когда main.exe не связан с core.dll, который был связан с / INCREMENTAL, и когда мой проектнеявно связан со сборкой релиза wxWidgets (которая не является инкрементно связанной), foo.dll вылетает во время выполнения при выделении нового wxPropertyGrid или wxPropertyGridManager (пробовал оба). Исключение выдается в пределах "wxmsw30u_propgrid_vc_x64_custom.dll", который, очевидно, является DLL-сеткой свойств. Поскольку отладочная версия wxWidgets инкрементно связана и не дает сбоя, я не смог получить более подробную информацию, чем эта.

То есть при использовании версии Releasex wxWidgets DLL мой проект работаетесли и только если core.dll связан с / INCREMENTAL, а затем связан с main.exe, независимо от того, является ли main.exe инкрементно связанным. foo.dll может быть связан с core.dll, который был связан с / INCREMENTAL: NO, и по-прежнему корректно открывается с помощью main.exe, если это условие выполняется. Нет проблем с отладочной DLL-версией wxWidgets, которая построена с /INCREMENTAL.

Это обобщает мою конкретную проблему. Поскольку реальный код состоит из нескольких файлов, я решил свести этот вопрос к фундаментальной проблеме: как инкрементная компоновка может привести к успешному запуску ошибочной сборки? Я хотел бы получить некоторое представление об этом вопросе, в частности, так как он действительно озадачивает меня.

РЕДАКТИРОВАТЬ: В частности, я использую wxWidgets-3.0.4 в Visual Studio 2019 для последнего пакета Windows 10 SDK. Архитектура машины x64. Я строю проект с помощью CMake и не сталкивался с такими проблемами в Linux при соединении с g ++ - 6.3.0 и использовании dllopen вместо LoadLibraryW.

...