2013-06-16 5 views
5

Я столкнулся с странной ошибкой при попытке запустить приложение (которое я не изменил код на некоторое время, так как оно работает нормально), ссылаясь на мою DLL. Эта DLL работала, но я вносил изменения в код DLL и заставлял ее компилировать все в порядке. К сожалению, при попытке запуска приложения ...Точка входа не найдена

--------------------------- 
GameTest001.exe - Entry Point Not Found 
--------------------------- 
The procedure entry point [email protected]@[email protected]@@Z could not be located in the dynamic link library Renderer02.dll. 
--------------------------- 
OK 
--------------------------- 

Я понятия не имею, как интерпретировать эту ошибку. Я знаю, какие изменения я сделал, и мой код выглядит хорошо для меня. Я пробовал это в Гуглинг, и мне не повезло.

Может ли кто-нибудь пролить свет на это? Что означает эта ошибка?

ответ

2

Вы ссылаетесь на функцию, которая была экспортирована с искаженным именем, и это имя [email protected]@[email protected]@@Z. Загружаемая DLL не экспортирует функцию этого имени и, следовательно, ошибку.

Название mangling кодирует имя функции, параметры и возвращаемое значение. Поэтому наиболее вероятной причиной несоответствия является то, что вы изменили имя, параметры или возвращаемое значение функции в одном месте, а не другое.

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

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

Update

Я не делал это достаточно ясно в тексте выше. Всякий раз, когда вы меняете интерфейс DLL, вы должны сделать следующее:

  1. Обновите любые файлы .h, используемые приложением.
  2. Повторно скомпилируйте DLL для создания новых файлов .lib и .dll.
  3. Повторно скомпилируйте приложение, используя обновленные файлы .lib и .h.
  4. Распределите новый DLL-файл, чтобы обновленное приложение загрузило обновленную DLL.
+0

Я перестроил DLL и его Lib файлы много раз безуспешно. Однако мне кажется, что мне действительно нужно перестроить приложение, которое мне не нужно было перестраивать в течение нескольких недель, которое использовало каждую новую версию DLL. – Interminable

+0

Да, вот что я сказал. Вы изменили DLL, и поэтому для использования нового .dll-файла вам нужно скомпилировать приложение с новыми версиями файлов .h и .lib. –

+0

Вы не упомянули, что мне также нужно было перекомпилировать приложение (предыдущие изменения в DLL не требовали перекомпиляции приложения). – Interminable

2

Похоже, что функция Music::Music(class Music const &) отсутствует в вашей DLL. [email protected]@[email protected]@@Z - искаженное имя для этой функции. Вы можете развернуть имена функций, используя this site.

+0

Большое спасибо за этот сайт! – Interminable

+0

Demangling не решит проблему. Решение состоит в том, чтобы обеспечить соответствие как DLL, так и приложений. –

+1

Да, но зная, что на самом деле деманлированный материал по-прежнему полезен, верно? – Interminable

0

Попробуйте это в C++ код

extern "C" 
{ 
    inline __declspec(dllexport) int MyFunction() 
    { 
    return 63; 
    } 
} 
Смежные вопросы