여러 프로젝트 사이에서 발생한 LNK2001 오류

4522 단어 기타기타

지긋지긋한 링크 오류..

비주얼 스튜디오를 사용한다면 한번 쯤은 겪어보는 링크 오류가 저에게 또 다시 발생했습니다.
정말 짜증나는 오류이지만 이번에도 조금만 수정을 가하면 해결될 거라고 생각했는데요.
몇 시간동안 씨름하다가 겨우 해결했습니다. 구글링해도 잘 나오지 않아서 고생 좀 했습니다.

컴파일과 링크

소스코드가 실행가능한 파일로 만들어지는 과정은 다음과 같습니다.

Code → Preprocess → Compile → Assemble → Linking → Excutable

여기서 우리가 주목해야 될 곳은 컴파일링크 단계입니다. 컴파일러는 소스코드를 어셈블리어로 번역하고, 어셈블러는 이를 컴퓨터가 이해할 수 있는 기계어로 번역해줍니다.
그 후에 생성되는 파일이 바로 .obj 파일입니다.

근데 이 파일은 실행가능한 파일이 아닙니다. 실제로 실행하려면 그에 필요한 라이브러리가 필요합니다.
라이브러리는 우리가 작성한 코드를 실행하기 위해 필요한 함수들을 포함하고 있습니다.
이것은 보통 .lib 혹은 .dll 형태로 존재하는데 이런 파일들이 서로 잘 연결되어야 비로소 실행가능한 .exe 파일로 만들어지는 것이죠.

근데 제가 이 개념을 지금까지 오해하고 있었습니다.
우리가 작성한 코드들도 라이브러리가 될 수 있다는 점 말입니다.

더 구체적으로 말하면, 우리가 생성한 헤더파일, 소스파일이 모두 라이브러리가 될 수 있다는 점이죠.

문제의 시작

저의 솔루션에는 여러가지 프로젝트들이 있습니다. 제가 원했던 방식은 하나의 프로젝트에서 만든 코드를 다른 프로젝트로 include 해서 사용하는 것입니다.

이를테면 이렇습니다.

A 프로젝트 a.cpp

#include "../B/b.h"

int main()
{
    BClass b;
    b.DoSomething();
}

B 프로젝트 b.h

#pragma once

class BClass
{
public:
    BClass();
    void DoSomething();
};

B 프로젝트 b.cpp

#include "b.h"

BClass::BClass()
{
}

BClass::DoSomething()
{
   // Do something
}

A 프로젝트의 소스코드에서 b.h를 include해서 사용하고 있습니다.
하지만 여기서 LNK2001 오류가 발생합니다.

a.obj : error LNK2001: 확인할 수 없는 외부 기호 "public: __cdecl BClass::BClass(void)

정말 보기도 싫은 오류메세지인데요. 간단하게 말해서 obj 파일을 만들 때 BClass라는 클래스를 잘 찾아서 번역까지 했지만 나는 이것이 어떤 기능을 하는 것인지 모른다 라는 것입니다.

즉 연결된 라이브러리에서 이 기능을 수행하는 부분을 찾지 못했다는 것입니다.

하지만 분명히 이 코드에서는 b.cpp 부분에서 b.h를 연결했습니다. 함수도 모두 정의했기 때문에 보통의 경우라면 잘 돌아가야하는게 정상이죠. 그런데 이 경우는 프로젝트가 2개입니다.

프로젝트 A에서는 BClass와 관련된 파일이 존재하지 않습니다. 다만 b.h는 연결해주었기 때문에 컴파일 단계에서 오류가 나타나지 않았습니다.
그렇지만 링크 단계에서 이와 관련된 라이브러리가 프로젝트 A 폴더 내부에 존재하지 않기 때문에 링크 오류가 발생하는 것입니다. BClass와 관련된 파일은 모두 프로젝트 B에 있으니까요.

여기서 B 프로젝트의 헤더파일과 소스파일은 라이브러리의 역할을 한다고 볼 수 있습니다.
따라서 라이브러리를 프로젝트 A에 연결해주어야 할 필요가 있는 것입니다.

해결법

글이 너무 길어졌지만 답안은 아주아주 간단합니다. 프로젝트 A에서 프로젝트 B를 참조하면 되는데요.


프로젝트의 참조 → 참조 추가에서 원하는 프로젝트를 체크하기만 하면 됩니다.

이거 몰라서 한참 해맸다는 게 너무 부끄러워질 정도로 간단하네요.
결론은 프로젝트 내부에 해당 라이브러리가 존재하는 지를 잘 검토해야하고, 내가 만든 소스파일도 라이브러리의 하나로 볼 수 있다는 점을 명심해야 한다는 것입니다.

좋은 웹페이지 즐겨찾기