[D] link.exe 문제발생 시 D

DUB으로 `dub build` 치다보면 가끔 link.exe-링커 에러를 겪을 수 있습니다.

Linking...
OPTLINK (R) for Win32 Release 8.00.17
Copyright (C) Digital Mars 1989-2013 All rights reserved.
http://www.digitalmars.com/ctg/optlink.html
.dub\build\application-debug-windows-x86-dmd_2083-50047D536011A0E9B28F124D86D16064\xaru.obj(xaru)
Error 42: Symbol Undefined __D4xaru11application15XaruApplication6__ctorMFAyaZCQBxQBvQBl
.dub\build\application-debug-windows-x86-dmd_2083-50047D536011A0E9B28F124D86D16064\xaru.obj(xaru)
Error 42: Symbol Undefined __D4xaru11application15XaruApplication7__ClassZ
.dub\build\application-debug-windows-x86-dmd_2083-50047D536011A0E9B28F124D86D16064\xaru.obj(xaru)
Error 42: Symbol Undefined __D4xaru11application12__ModuleInfoZ
Error: linker exited with status 3
C:\D\dmd2\windows\bin\dmd.exe failed with exit code 1.

애초에 DMD는 C:\D\dmd2\windwos\bin\에 존재하는 link.exe라는 독자적인 링커를 사용합니다.
문제는 밑에서 두번째 라인의 'status 3'가 좀 이상한데... 몇가지를 의심해볼 수 있습니다.

1) 엉뚱한 링커를 실행하였다
C:\D\dmd2\windwos\bin\ 밑에 위치한 link.exe를 사용해야 하는데 다른 링커를 사용할 수도 있습니다.
GCC의 윈도우 패키지인 MinGW의 GCC도, Visual Studio도 link.exe라는 독자적인 링커를 사용합니다.
원래 DUB은 C:\D\dmd2\windwos\bin\ 밑에 있는 링커를 참조하게 되어있는데 혹시 모르니 ①파일탐색기에서 link.exe를 찾아보고 다른 link.exe가 실행되었는 지 커맨드창에 link.exe만 실행하여 검사해봅니다.
②환경변수의 PATH값에 C:\D\dmd2\windwos\bin\가 올바르게 들어갔는 지 역시 함께 확인해줍니다.

2) 로컬 라이브러리의 참조문제
status 3라면 대게 한번 의심해볼 만 합니다.
보통 DUB패키지는 code.dlang.org에 등록된 걸 dub.json이나 dub.sdl → dependencies쪽 key에 value부분을 추가하는 방법으로 패키지를 사용합니다.
이 외에도 dub형태를 갖춘 로컬 라이브러리를 참조가능한데 저같은 경우는 DUB에 등록하지 않은 패키지를 사용하면서 발생했습니다.

2-1. 빌드버전이 상이하다
`dub add-local`로 추가한 '로컬 라이브러리'의 빌드 컴파일러와 현재 사용하는 컴파일러의 버전이 서로 상이한 경우입니다.
밑에처럼요...

1. DMD 2.067로 Local Library 빌드
2. 이 Local Library를 참조하는 DUB프로젝트 빌드 시 → 잘됨. 컴파일러 버전이 같으므로.
3. 컴파일러를 DMD 2.068로 업데이트
4. DUB프로젝트 빌드 시 → 에러. Local Library는 2.067인데 빌드하려는 프로젝트의 컴파일러는 2.68로 버전 불일치

2-2. 참조경로에 라이브러리가 옳바르지 않다
참조할 로컬 라이브러리가 옳바르지 않다는 건 '해당 라이브러리 코드에 문제'가 있거나 엉뚱한 경로로 참조하고 있을 경우 입니다.

이럴 땐 해당하는 로컬패키지에 직접들어가 `dub build`로 빌드를 수행해준 후 다시 시도하면 됩니다.
2-1처럼 코드에러라면 고쳐주면 되고, 빌드가 잘 된다면 2-2 문제입니다.
그럴 땐 해당 라이브러리에서 로컬라이브러리임을 ①해제, ②라이브러리만 빌드, ③다시 설정 해주어야 합니다.

1
2
3
dub remove-local ./
dub build
dub add-local ./

요렇게 처리해주시면 됩니다.

덧글

댓글 입력 영역