Должен ли различаться исполняемый файл, созданный VS2010 на разных платформах?

У меня есть большой проект C ++ под Visual Studio 2010 v10.0.40219.1 SP1Rel, с которым я начал видеть ошибку в одном из наших регрессионных тестов. Когда я проверил ошибку на компьютере разработчика, я не смог этого сделать, поэтому скопировал exe-файлы с тестовой машины на компьютер разработчика, и ошибка появилась. Затем я удалил исходное дерево, включая проекты, с тестовой машины, скопировал их с машины разработки, очистил и перестроил их на тестовой машине, и ошибка все еще была. Таким образом, в основном исполняемые файлы, созданные из одного и того же проекта и конфигурации на моем компьютере разработчика, с той же версией компилятора и установленными исправлениями, отличаются от тех, которые созданы на тестовом ПК. Разница лишь в том, что на компьютере разработчика установлена ​​операционная система Windows 7 64, а на тестовом компьютере — XP. Я также проверил, что все связанные LIB и DLL одинаковы на обеих платформах сборки.

Если бы одни и те же исполняемые файлы давали разные результаты на разных компьютерах, я бы предположил, что в моем коде была какая-то ошибка для конкретной платформы, но одни и те же исполняемые файлы ведут себя согласованно на разных компьютерах, только те, что скомпилированы в XP, ведут себя не так, как скомпилированные на W7 64.

Есть идеи, почему это должно быть?

редактировать Восстановите код в конфигурации отладки на тестовой машине, и ошибка исчезнет. В настоящее время копируем исходные деревья и инструменты на пустые файлы XP и W7, чтобы увидеть, соответствует ли проблема платформе сборки или относится к одному из используемых в настоящее время компьютеров.

Edit2 Скопировал дерево исходников на два новых ПК, один XP, один Windows7 и перестроил. Exe показывает ошибку только тогда, когда построен на выпуске XP. Не происходит в отладочной версии XP, только оптимизированная сборка выпуска. Сборка Win 7 отлично работает на XP и Win 7, сборка XP показывает ошибку на XP и Win 7. Потратив немного времени, пытаясь лучше изолировать ошибку, чтобы выяснить, что именно происходит, но, безусловно, существуют различия в компиляции на основе платформы сборки.

Edit3 Проблема действительно была неинициализированной переменной или, точнее, неинициализированной структурой в шаблоне, что-то близкое к ней;

template<class TYPE>class MyTemplateClass
{
public:
assign(TYPE &x) { x = t; }

TYPE t;
}

Уровень предупреждения 4, кажется, не подхватывает это.

4

Решение

Вы сравнивали двоичные исполняемые файлы? Это можно сделать в командной строке с помощью fc /b file1 file2 (посмотреть здесь). Это, по крайней мере, проверит, производите ли вы ту же программу, и не испытываете ли что-то странное вне созданного исполняемого файла.

Вероятно / возможно, некоторые статические библиотеки компилируются, и могут быть другие .h файлы, которые не являются частью вашего кода. Всегда возможно, что у них есть ошибки. Убедитесь, что ваши библиотеки и SDK имеют одинаковые версии, а не только компиляторы. Если возможно, попробуйте обновить их.

Если ошибки исчезают с разными флагами компилятора, то ваша программа может работать / не работать, возможно, из-за некоторого неопределенного поведения (например, неинициализированная переменная). Убедитесь, что все флаги предупреждений компилятора включены, чтобы помочь найти их. К сожалению, Visual Studio — не самое лучшее в сообщениях об ошибках и предупреждениях, но они все же помогают.

1

Другие решения

Других решений пока нет …