본문 바로가기

3.구현/VC++

[에러]LNK1241 Linker Tools Error

MSDN에서 LNK1241 링크 에러는 cvtres와 관련해서 설명하고 있다.
그러나 실제 이런 cvtres 툴을 사용하면서 까지 리소스를 관리하지는 않는다. 그정도 까지 쓰는 경우는 드물다.

[원인]

결론적으로 말하면, 보통 스태틱 라이브러이(정적 라이브러리)에서 리소스(.rc)를 사용하려 할때 발생한다.
보통 실수로 마우스 조작하다가 리소스 추가할 경우가 생긴다. 원래는 함수나 클래스를 추가하려고 했을 때이다.
리소스 추가를 취소하지만, 기본 리소스 정보를 이미 추가했기 때문에 문제가 발생한다. 즉, .res 파일이 자동으로 생기면서 lib파일에 포함된다.

[해결]

보통 .res 정보는 exe나 dll 파일에만 추가되며 lib파일에는 사용할 수 없다. 왜냐고 물어본다면, 나도 정확히 모르겠다. 물론 확인해보면 알 수 있지만.. 귀찬니즘 ㅡ.ㅡㅋ
lib는 보통 함수 집합이고, 단위 실행 컴포넌트는 아니기 때문에 rec가 필요는 없겠지.

[기타]

이렇게 해서 rc 정보를 정적 라이브러리 만드는 프로젝트에서 제거하고 다시 리빌드하니깐 에러가 없다.
근데, 다시 원래 에러를 만들려고 리소스를 추가해서 다시 컴파일하니깐 이번에는 에러가 발생하지 않은다. 이런 엿같은 경우가 있나.
아무튼 이렇게 해결했고, 왜 이런지 알고 계신분은 밑에 덧글을 남겨주시기 바랍니다.

해당 프로젝트 파일(vcproj)를 텍스트 에디터로 연다. 사실 VC에서는 작업하지 못한다.
그리고 먼저 리소스 파일 정보를 제거한다. 예를 들어 위의 경우 Utils.rc파일 를 제거한다. 아마 다음과 같을 것이다.

<File
   RelativePath=".\Utils.rc">
</File>

위의 내용을 삭제한 후에 Resource Tool 정보를 제거한다.

<Tool
    Name="VCResourceCompilerTool"
    ResourceOutputFileName=""/>

위의 태그가 여러 곳에 있는데 각각 Debug, Release 등에 속해있는데 모두 제거한다.
그리고 재 컴파일하다. [끝]
아참 혹시 모르니깐 Release와 Debug 폴더에 있는 내용은 모두 지운다. 간혹 Release와 Debug에 남아 있는 내용을 컴파일에 사용하기도 한다. ㅡ.ㅡㅋ

반응형