Странная проблема компиляции - DLL не компилируется одинаково на некоторых машинах - PullRequest
2 голосов
/ 30 апреля 2011

Я не прошу SO сообщить мне, в чем проблема, я просто спрашиваю, какие проверки работоспособности следует запустить в таком случае:

Использование VisualStudio 2005, простой проект C ++.Фактический код:

int Sum(int a, int b)
{
    return a+b;
}

Нет предварительно скомпилированных заголовков.Экспортируется с файлом DEF:

LIBRARY testdll
EXPORTS
    Sum

Скомпилированный на тестовом компьютере (снова VS2005), DLL работает на других компьютерах (64-битные и 32-битные тестированные, всегда скомпилированные с целевой платформой Win32).Скомпилированная на моей машине (64-битная, тот же проект, те же свойства), DLL работает на моей машине только , на других она запускает отладчик Just-In-Time (или ужасно падает, если JIT не установлен)):

Необработанное исключение в 0x00000000 в Caller.exe: 0xC0000005: Место чтения нарушения доступа 0x00000000.

Сначала я вызывал его с на моих тестовых компьютерах, и это тоже не помогло бы (с cder) сообщением об ошибке «файл не найден».

Другой признак: Размер файла другой, моя машина дает DLL дополнительные 512байт.

Конфигурация моей системы:

  • Windows Vista - 64 бита
  • VS2005 Версия 8.050727.867 (vsvista.050727-8600)
  • .NET Framework версии 2.0.50727 SP2

Протестированные среды:

  • Windows XP - 32-разрядная (виртуальная машина)
  • VS2005 версия 8.0.50727.42 (RTM.050727-4200)
  • .NET Framework версии 2.0.50727 SP2

  • Windows XP - 64-битная

  • VS2005 версия 8.0.50727.42 (RTM.050727-4200)
  • .NET Framework версия 2.0.50727 SP2

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Откройте обе библиотеки DLL в Dependency Walker и посмотрите, что отличается. Желательно делать это на компьютере, где одна DLL работает неправильно.

1 голос
/ 30 апреля 2011

Я полагаю, что на вашей 64-битной машине неправильно настроена целевая платформа Win32. Я рекомендую вам запустить «Командная строка Visual Studio 2005» и использовать

dumpbin.exe / headers YouDll.dll

для проверки "неправильной" DLL, которая будет создаваться на 64-битной машине. Вы можете сравнить это с «хорошей» DLL. Я полагаю, что вы сразу увидите различия. WinDiff.exe может помочь вам дополнительно.

Один небольшой общий совет: попробуйте использовать EXTERN_C и WINAPI (или __stdcall ) для всех функций, которые вы экспортируете из DLL.

...