본문 바로가기
삽질/C, C++, Visual Studio

[ VS 삽질 ] 확인할 수 없는 외부 참조, 확인할 수 없는 외부 기호

by SteadyForDeep 2020. 12. 15.
반응형

 

 

 

 

 

개빡치는 상황이다.

LNK1120

LNK2019

 

링커 에러는 정말 만나고 싶지 않은 녀석들이다. 찾아봐도 도무지 답도 안나오고 에러를 봐도 어디서 난건지 알 길이 없다.

 

 

 

 

분명 VS상에서는 오류가 없다고 하는데 빌드가 안되니 진짜 죽을 맛이다.

 

거기다가 dll, obj 파일에서 오류가 뜨니 부검도 불가능한 수준.

 

스택오버플로우나 마소 공식사이트가면 뭐라뭐라 말은 해뒀는데 결론은 지들도 모른다는 말이다.

 

화를 가라앉히고

내가 조사한 원인은 대체로 아래와 같다.

 

1. main함수가 정의되지 않았다.

2. 미리 정의되지 않은 변수나 함수가 사용되었다.

3. x86, x64가 혼재된 솔루션을 빌드했다. (내 경우)

 

위의 원인들을 요약하면 2번이 전부다.

 

변수나 함수의 정의 순서가 중요한 C에서는 main을 실행하려고 봤더니 main이 없다던가

main 아래에 정의되어 있어서 VS가 저기있구나 ㅇㅇ 하고 애러를 안 알려줬다던가

x64로 빌드했는데 x86으로 정의되어있어서 도무지 알아볼 수 없었다던가 뭐 그런 일들이다.

 

한마디로 "코드상에서는 문제 없는데 컴파일러가 못 알아먹는다." 라는 오류 되시겠다.

 

 

 

 

//솔루션

우선 내 상황은 64비트로 컴파일된 DLL을 32비트로 빌드하는 솔루션에 사용하고자 했다.

 

물론 솔루션 설정을 64로 고쳤지만 아래와 같은 설정을 추가적으로 해줘야만 했다.

 

오류 목록이 아니라 출력을 보자.

로그를 봐야한다. VS를 사용하다보면 오류목록에 의존하기가 쉬운데 출력에 나온 로그를 꼭 봐야한다.

 

나는 main도 있고 (혹은 DLL빌드라 필요없고) 함수, 변수 다 잘 정의되어있다고 나오는데 왜 이 모양임?

 

이라고 분노한 자들이 여기까지 왔을것이라고 생각한다. 그렇다면 출력을 올려보자.

 

사진을 보면 "구성 : Debug Win32" 라고 출력된 것을 알 수 있다. (지나가는 순간의 찰나를 매의 눈으로 잡아낸 것다 캬)

 

여기에 낚였다. 진짜 개빡친다.

나도 바보가 아닌지라 솔루션을 x64플랫폼으로 설정하고 빌드를 한 것이다. 그런데 플랫폼을 바꾸면 안되고 구성을 바꿔야만 한다.

빌드 > 구성관리자 로 들어가면

이렇게 구성관리자가 띠용 하고 나온다. 여기를 x64로 바꿔주면 

이렇게 구성이 x64 로 바뀌면서 

빌드에 성공하게 된다. (감동)

 

 

 

반응형

댓글