OpenGL Точка входа не найдена [дубликат]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
5
задан Jordi 4 December 2009 в 10:26
поделиться

4 ответа

Я чувствую себя немного глупо, но я нашел ответ. В приложении (exe) я использовал, по-видимому, загруженную вторую, другую dll, которая зависела от той, что упоминалась в моем первоначальном сообщении. Эта вторая dll все еще ожидала старых функций и также нуждалась в перекомпиляции с обновленной dll.

Большое спасибо людям, которые пытались мне помочь здесь!

1
ответ дан Jordi 4 September 2018 в 08:29
поделиться

На самом деле вы используете __declspec(dllexport) ? Моя догадка - нет - без этой декларации эта функция не будет экспортироваться DLL (или, другими словами, программы, загружающие DLL, не будут иметь доступ к функциям без этой декларации).

Кроме того, попробуйте используя Dependency Walker , чтобы увидеть, какие именно функции вашей библиотеки DLL доступны.


Тот факт, что __declspec(dllexport) не используется в объявлениях функций, в порядке - большая часть время, оно будет использоваться только один раз в одном файле заголовка, например

#ifdef MAKING_DLL
#define FOO_API __declspec(dllexport)
#else
#define FOO_API
#endif

. Таким образом, если у вас есть #define MAKING_DLL до этого раздела, все функции, объявленные как FOO_API int BakeACake(), будут экспортированы на основе определения MAKING_DLL. Возможно, проект ожидал, что MAKING_DLL (или его эквивалент) будет определен в командной строке в зависимости от типа проекта (например, /DMAKING_DLL, или вам может даже понадобиться определить FOO_API как /DFOO_API=__declspec(dllexport).

Пустая верхняя правая секция в Dependency Walker просто означает, что ваша программа не связывается с соответствующим DLL-файлом DLL. Это нормально, это просто означает, что вы используете LoadLibrary или LoadLibraryEx для доступа к функциям в DLL.

Другой довольно вероятный сценарий (основанный на том, что измененные имена разные) заключается в том, что программа была построена с использованием другой версии Visual Studio, чем 2008, которую вы использовали для создания DLL В отличие от обычного C нет стандартного двоичного интерфейса для C ++, а это значит, что вам нужно использовать тот же компилятор для сборки программы и DLL, когда вы используете классы C ++ в DLL. Если вы можете, попробуйте перестроить программу в VS2008 , или попробуйте перестроить DLL в той же версии VS, что и при создании программы.

8
ответ дан Mark Rushakoff 4 September 2018 в 08:29
поделиться
  • 1
    Спасибо за Ваш ответ! Я попытался взглянуть на ваши предложения, но я все еще застрял (см. Обновление к моему вопросу). Если у вас будет больше предложений, это будет здорово! – Jordi 4 December 2009 в 10:29

Загрузите walker и откройте вашу dll с помощью этого инструмента. Он отобразит список экспортируемых функций из вашей DLL. Проверьте, является ли указанный выше метод частью ожидаемых функций. Если это не так, значит, вы случайно удалили __declspec(dllexport) для одного из классов в этой DLL.

2
ответ дан Ponting 4 September 2018 в 08:29
поделиться
  • 1
    Ваш ответ, похоже, точно такой же, как и плакат над вами, но спасибо в любом случае! Я пробовал предложения, но я все еще застрял (см. Обновление к моему вопросу). Я был бы благодарен за помощь! – Jordi 4 December 2009 в 10:31
  • 2
    @Jordi: Это первое, что люди будут делать, столкнувшись с этой проблемой. Наверное, мы начали печатать вместе, и он закончил передо мной. – Ponting 8 December 2009 в 18:20

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

0
ответ дан Toon Krijthe 4 September 2018 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: