ПрограммированиеFAQОбщее

Процесс сборки программы и ошибки LNK2019

LNK2019 — распространенная ошибка у тех, кто первый раз добрался до использования внешних библиотек. Она является следствием используемого в компиляторах С/С++ подхода с разделением файлов с объявлением (*.h) и описанием (*.c|*.cpp|*.cxx). В отличии от компиляторов Pascal/Delphi, в файлах .h нет информации о том, откуда брать указатель на внешнюю функцию.

Сборщику программы дается информация по всем используемых в программе файлам библиотек (.lib для MSVC++, .so, .a для GCC/MinGW), который сопоставляет каждому имени функции ее адрес.

LNK2019 возникает, когда компоновщик не знает, какой адрес подставить вместо некоторого заданного имени функции.

При использовании:
1. MSVC++, самым простым способом является использовать специфичную для него директиву, ее необходимо добавить в любой из файлов *.cpp|*.c :

#pragma comment(lib, "название-библиотеки.lib")

2. GCC/MinGW, необходимо добавить опцию -lимя_библиотеки на этапе сборки.

При использовании IDE Code::Blocks необходимо добавить библиотеку через Project->Build options...->Linker settings->Link libraries->Add

Пара примеров возникновения ошибки:

[DevIL, msvc++]

1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__ilGetData@0 в функции "void __cdecl Init(void)" (?Init@@YAXXZ)
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__ilGetInteger@4 в функции "void __cdecl Init(void)" (?Init@@YAXXZ)
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__ilLoad@8 в функции "void __cdecl Init(void)" (?Init@@YAXXZ)
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ __imp__ilInit@0 в функции "void __cdecl Init(void)" (?Init@@YAXXZ)

[Bullet, msvc++]

1>integral.obj : error LNK2019: unresolved external symbol "public: void __thiscall btCollisionObject::activate(bool)" (?activate@btCollisionObject@@QAEX_N@Z) referenced in function "void __cdecl init_phys(void)" (?init_phys@@YAXXZ)
1>integral.obj : error LNK2019: unresolved external symbol "public: __thiscall btRigidBody::btRigidBody(struct btRigidBody::btRigidBodyConstructionInfo const &)" (??0btRigidBody@@QAE@ABUbtRigidBodyConstructionInfo@0@@Z) referenced in function "void __cdecl init_phys(void)" (?init_phys@@YAXXZ)
1>integral.obj : error LNK2019: unresolved external symbol "public: __thiscall btDiscreteDynamicsWorld::btDiscreteDynamicsWorld(class btDispatcher *,class btBroadphaseInterface *,class btConstraintSolver *,class btCollisionConfiguration *)" (??0btDiscreteDynamicsWorld@@QAE@PAVbtDispatcher@@PAVbtBroadphaseInterface@@PAVbtConstraintSolver@@PAVbtCollisionConfiguration@@@Z) referenced in function "void __cdecl init_phys(void)" (?init_phys@@YAXXZ)
1>integral.obj : error LNK2019: unresolved external symbol "public: __thiscall btSequentialImpulseConstraintSolver::btSequentialImpulseConstraintSolver(void)" (??0btSequentialImpulseConstraintSolver@@QAE@XZ) referenced in function "void __cdecl init_phys(void)" (?init_phys@@YAXXZ)

[OpenGL, gcc]

/home/123/work/main.c:35: undefined reference to `glCallList'
/home/123/work/123/main.c:40: undefined reference to `glNewList'
/home/123/work/123/main.c:41: undefined reference to `glClear'
/home/123/work/123/main.c:44: undefined reference to `glBegin'

#Visual C++, #проблемы сборки

24 июля 2012 (Обновление: 11 мар 2024)