Почему линковщик не видит символ?

144
19 сентября 2021, 16:40

В начале файла dllmain.cpp есть такой фрагмент кода: extern "C" HINSTANCE hAppInstance;. При линковке вылетает ошибка LNK2001 unresolved external symbol _hAppInstance C:\...\dllmain.obj, но никаких _hAppInstance в проекте нет. Есть только hAppInstance, который используется в dllmain.cpp и который объявлен. MSDN говорит, что LNK2001 появляется если символ не объявлен (https://docs.microsoft.com/en-us/cpp/error-messages/tool-errors/linker-tools-error-lnk2001?view=vs-2019). Что не так с объявлением hAppInstance и почему линковщик не видит его?

Answer 1

При записи "в одну строчку", т.е. без {}

extern "C" HINSTANCE hAppInstance;

является объявлением, но не определением переменной. Без определения разумеется будет LNK2001.

  • Либо добавьте отдельное определение (после этого объявления)

    extern "C" HINSTANCE hAppInstance;
    HINSTANCE hAppInstance;
    
  • Либо превратите это объявление в определение путем добавления явного инициализатора

    extern "C" HINSTANCE hAppInstance = 0;
    
  • Либо превратите это объявление в определение путем добавления {}

    extern "C" { HINSTANCE hAppInstance; }
    
READ ALSO
std::unique_lock не захватывает мьютекс

std::unique_lock не захватывает мьютекс

Разрабатываю имплементацию очереди задачВ классе содержатся следующие данные:

78
Как из проекта Qt сделать библиотеку?

Как из проекта Qt сделать библиотеку?

подскажите пожалуйста, у меня есть проект на Qt с использованием qml-я, своеобразное приложение для работы с базой данныхВозникла необходимость...

113
Как составить граматику чтобы она заработала?

Как составить граматику чтобы она заработала?

Создаю граматику для вычисления выраженияИспользую Boost

115