Я создаю приложение и использую библиотеку x264 в качестве кодировщика. Я построил библиотеку для моей системы Windows, используя MSys / MingW. Библиотека отлично работает при отладочной сборке (обратите внимание, что как в отладочной, так и в выпускной сборках используются настройки VS2010 по умолчанию). Однако при выпуске возникает ошибка нарушения доступа при первом обращении к библиотеке x264, а именно:
Unhandled exception at 0x00905a4d in StreamTest.exe:
0xC0000005: Access violation.
В этой строке выдается ошибка:
x264_param_default_preset((params), "veryfast", "zerolatency");
Пока я выяснял, как скомпилировать библиотеку, я много говорил о выравнивании памяти в Windows / Visual Studios и о том, как она не особенно совместима с выравниванием, ожидаемым x264. Например, при компиляции в MSys мне пришлось включить --enable-memalign-hack. Мне интересно, может ли источник этой ошибки быть связан с проблемой выравнивания памяти, которая проявляется только через некоторые настройки в моей сборке релиза. К сожалению, я почти ничего не знаю о специфике и поэтому пришел сюда.
Может ли кто-нибудь дать мне больше информации о проблемах выравнивания памяти и любых настройках Visual Studio, которые могут вызвать это? Любые другие советы / указатели, чтобы исправить эту проблему, очень приветствуются.
Спасибо.
Редактировать
Из ответа ниже:
- Из связанного вопроса SO у меня сложилось впечатление, что он добавил «build with debugger info» в сборку OpenCV? Поскольку я собираю библиотеку x264 через MSys с помощью G ++, я не уверен, что смогу это сделать. Я проверил настройки сборки для моего проекта, и в обоих выпусках и отладках он содержит информацию об отладчике. Не уверен, что я что-то пропустил в этом посте, пожалуйста, дайте мне знать.
Я попробовал верификатор приложения. Кажется, что x264 пытается выполнить код из неисполняемой памяти согласно выводу верификатора приложения:
VERIFIER STOP 0000000000000650: pid 0x1B18:
Попытка выполнить код в неисполняемой памяти (первый шанс).
0000000000905A4D : Address being accessed.
0000000000905A4D : Code performing invalid access.
000000000021EA90 : Exception record. Use .exr to display it.
000000000021E5A0 : Context record. Use .cxr to display it.
Что-нибудь можно извлечь из этого вывода?
Еще раз спасибо.