Вызов функции вызывает неправильную функцию

Я компилирую статическую библиотеку С++ в 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, а не через настройки проекта должна быть более безопасной.