본문 바로가기
SWE/Qt

Error LNK2019 / Error LNK2001

by S나라라2 2019. 10. 25.
반응형

[에러 내용 1]

moc_cameramodel.obj : error LNK2001 : "private : void __thiscall CameraModel::onDocGetMessage(int): (?onDocGetMessage@CameraModel@@AAEXH@Z) 외부 기호를 확인할 수 없습니다.

1>d:[path]\penta\Debug\ui_penta.exe : fatal error NK1120 : 1개의 확인할 수 없는 외부 참조입니다.

 

[에러 원인]

case 1 ) 함수를 선언만 하고, 구현하지 않은 경우

-> 나 같은 경우에는 cameramodel.h에서 선언해놓은 onDocGetMessage라는 함수를 cameramodel.cpp에서 구현하지 않았었다.

 

case 2 ) visual studio를 쓰고 있다면 컴파일에서 나오는 해당 obj 파일이 솔루션 탐색기에 추가되어 있지는 않은지 확인한다. 있다면 지우고 재실행.

 

case 3 ) visual studio 솔루션 탐색기에 추가되어 있지 않은 경우.

 해당 파일을 호출해서 사용하고 있으나, 솔루션 탐색기에 없어서 빌드할 때 에러가 나는 것이다.


[에러 내용 2]

LNK2001        "public: virtual struct QMetaObject const * __cdecl SsScreen3Test::metaObject(void)const " (?metaObject@SsScreen3Test@@UEBAPEBUQMetaObject@@XZ) 외부 기호를 확인할 수 없습니다.        ui        D:\Projects\br_2u_feature\git_lego_repository\proprietary\gui\qt\ss2\os\windows\build\visualstudio\ssscreen3_Test.obj

 

[에러 원인]

프로젝트 속성의 C++ 전처리와 Qt Meta-Object Compiler의 전처리를 다르게 기입한 것이 원인이었다.

나같은 경우는 c++ 전처리에는 'define xxx'를 기입해놓고 Qt Meta-Object에는 'define xxx'를 기입하지 않았다.

따라서 필요한 moc object 파일이 생성되지 않았었다.

 

전처리 define 비교 확인

- 프로젝트 속성> C/C++> 전처리기> 전처리기 정의

- 프로젝트 속성>Qt Meta-Objetc Compiler>Macro Definitions

 

 

 

lnk2019 lnk2001 에러 원인의 공통점

해당 에러를 여러번 겪어오면서 느낀 공통점은 링킹이 안되었을 때 나는 것이다.

visual studio를 사용할 때의 번거로움이기도 하지. 

 

지운 파일인데 moc파일은 솔루션 탐색기에 남아있으면 에러가 나기도 하고, 반대로 없으면 에러가 나기도 한다.

 

 


비슷한 에러 내용

eventlistmodel.obj : error LNK2001: "public: virtual struct QMetaObject const * __thiscall EventListModel::metaObject(void)const " (?metaObject@EventListModel@@UBEPBUQMetaObject@@XZ) 외부 기호를 확인할 수 없습니다.
1>eventlistmodel.obj : error LNK2001: "public: virtual void * __thiscall EventListModel::qt_metacast(char const *)" (?qt_metacast@EventListModel@@UAEPAXPBD@Z) 외부 기호를 확인할 수 없습니다.

 

해결방법

eventlistmodel.h를 qt meta object 로 컴파일한 후, moc_eventlistmodel.cpp 파일을 visual studio솔루션 탐색기에 추가해줘야 한다.

반응형