Вызов функции вызывает неправильную функцию
Я компилирую статическую библиотеку С++ в vs2008, а в решении у меня также есть проект запуска, который использует lib, и это отлично работает.
Но при использовании lib в другом решении я получаю ошибку проверки во время выполнения.
"Значение ESP не было должным образом сохранено в функциональном коду"
Пройдя через код, я заметил функцию foo(), прыгающую в bar() вместо непосредственно перед сбоем. Эти функции являются просто регулярными функциями и не содержат указателей на функции.
Кто-нибудь знает, что может происходить, и почему он работает при использовании lib из того же решения?
edit: функции (методы) являются частью класса, если это помогает.
Ответы
Ответ 1
Простите, что я заявляю о кровотечении, очевидном здесь, но... Я видел, что подобные вещи случаются много раз, прежде чем файлы объекта (.o) и header (.h) перестают синхронизироваться. Особенно в отношении виртуальных методов.
Рассмотрим: объектный файл скомпилирован с заголовком:
class Foo { virtual void f(); };
Но тогда заголовок будет изменен на:
class Foo { virtual void g(); virtual void f(); };
И для следующего объектного файла предположения компилятора о том, где f() находится в классе vtable, неверны.
Часто просто перекомпилирует мир (все!) поможет.
Ответ 2
Это, скорее всего, связано с несовместимыми соглашениями о вызовах, где библиотека и вызывающий абонент имеют разные представления о расположении стека.
Посмотрите MSDN для получения дополнительной информации.
Ответ 3
-
Убедитесь, что вы не выбрали
в вашем проекте старую версию
библиотека, I.e. (как упоминал Адам)
вы выбрали более старую отладку
версии вместо текущей версии
версии или наоборот.
-
Возможно, вам придется перестроить.
-
Также следите за условной компиляцией, где макрос может получить
#defined или # undef'd в некоторый момент (другое решение может иметь некоторые
макросы или проецируемые #defines). Некоторые
раз было бы полезно удалить
ваш .lib.obj и предварительно скомпилированный
заголовочные кэши с перестройкой.
-
Есть удаленная возможность, что что-то перепутано в вашей среде IDE
или конфигурации проекта, где вы
может потребоваться воссоздать проект
с нуля.
-
Я не очень хорошо знаком с MS VC, вы можете добавить проект библиотеки
файл из другого решения? Для
Например, в Borland С++ Builder вы
могут определять группы проектов и
строить/создавать несколько проектов, я
всегда ставить проекты на
библиотеки, которые я использую в своей программе
проектной группы, поэтому все становится
обновляется при создании.
Ответ 4
Убедитесь, что вы компилируете в режиме отладки, а не в режиме выпуска. Если вы попытаетесь отладить программу в режиме Release, данные, которые вы вернетесь из отладчика, будут мусором из-за оптимизации.
Ответ 5
Я помню такие вещи, когда выравнивание элементов структуры (/компилятор Zp) двоичных файлов было иным. Вы тоже можете это проверить.
Настройка его с помощью #pragma pack, а не через настройки проекта должна быть более безопасной.