LNK2005
-
pragma once는 만능이 아니다개발/C·C++ 2019. 9. 17. 21:33
pragma once 전처리기는 인클루드가 수행될 때 반복되는 걸 막는 기능을 할 뿐이다. pragma once를 사용했는데도 비주얼 스튜디오에서 LNK2005 오류가 발생하는 이유다. 소스코드의 빌드는 크게 세 가지 과정을 거친다. 전처리, 컴파일, 링킹으로 나눌 수 있는데, 전처리 과정에서는 소스 파일(cpp)에 있는 pragma, include, define 등의 지시자를 처리한다. 전처리 과정에서 문제가 없었으면 컴파일러는 전처리기기가 모두 코드로 대체된 순수한 C++ 소스 코드를 파싱해 어셈블리 코드로 만든다. 그다음에 기계 코드로 번역해 바이너리 파일을 만드는데 이것이 오브젝트 파일이다(.obj). 각각의 소스 코드 별로 독립적으로 컴파일이 완료되면 각각의 오브젝트 파일이 생성된다. 마지막으로..
-
미리 컴파일된 헤더를 쓰면서 생긴 문제 하나개발/C·C++ 2019. 9. 14. 20:25
콘솔에 로그를 출력할 때 색깔 등의 설정에 변화를 줄 수 있는 라이브러리가 있다(https://archive.codeplex.com/?p=cppconlib). 아직 이유는 파악 못했지만 해당 라이브러를 쓰기 위한 헤더 파일과 해당 헤더 파일을 인클루드 하는 헤더파일을 미리 컴파일된 헤더(like stdafx.h)에 넣어놓자(IOCP.h에서 Logger.h를 인클루드하는데, Logger.h가 conmanip.h를 인클루드하고 있고, IOCP.h와 Logger.h는 모두 미리 컴파일된 헤더에서 인클루드했다) 중복 정의 관한 오류인 LNK2005가 발생했다. 정확한 이유는 파악하지 못했다. 중복 문제를 일으킬 만한 인클루드 문제가 '확실하게 없고', 오류의 원인으로 지적된 _settextcolor() 함수나 ..