Skip to content

VisualStudio:Warning

Visual Studio 에서 나타나는 경고(Warning)와 그 해결방법에 대하여 설명한다.

PDB관련 LNK4099, LNK4204 링크경고 해결방법

vc90.pdb가 없거나 vc90.pdb는 있는데 그 안에 디버그 정보가 없다는 것. 이번 경우에는 프로토콜버퍼의 3가지 프로젝트가 똑같은 곳에다 vc90.pdb를 생성하는 바람에 파일이 덮어써졌다. 그래서 파일은 있지만 디버그 정보가 없는 경우에 해당한다. 구글의 C++ 테스트 프레임웍의 경우처럼 intermidiate directory(기본은 debug, release)에 프로젝트 이름을 다시 추가하는 방식으로 설정을 바꿔주면 깔끔하게 해결할 수 있다.

Output Directory : $(ConfigurationName)
Intermediate Directory : $(OutDir)\$(ProjectName)  

C2894

error C2894: templates cannot be declared to have 'C' linkage

This error happened when you include your header file

extern "C" {
    #include "Header.h"
}

just include #include "cs.h" outside extern c and you are good to go.

#include "Header.h"
extern "C" {
    //code
}

LNK2019

  • 'symbol' 외부 기호(참조 위치: ' function' 함수)를 확인할 수 없습니다.
  • 링커가 "function" 함수에 사용된 "symbol" 외부 기호에 대한 정의를 찾을 수 없습니다. 이 오류를 일으킬 수 있는 문제는 여러 가지입니다.
    • 기호 선언의 철자가 기호 정의의 철자와 같지 않습니다.
    • 함수가 사용되지만 매개 변수의 형식이나 개수가 함수 정의와 일치하지 않습니다.
    • 함수 또는 변수가 선언되었지만 정의되지 않았습니다.
    • 함수 선언과 함수 정의 간에 호출 규칙 (Calling convention)이 다릅니다.
    • 기호가 C 파일에 정의되어 있지만 C++ 파일에서 extern "C"를 사용하지 않고 선언되었습니다.
    • 기호는 정적으로 정의된 후 나중에 파일 외부에서 참조됩니다.
    • 클래스의 정적 멤버가 정의되지 않았습니다.
    • 빌드 종속성은 솔루션의 프로젝트 종속성으로만 정의됩니다.
    • Windows 응용 프로그램에 대한 설정을 사용하여 콘솔 응용 프로그램을 빌드합니다.
    • 여러 소스 파일에서 함수 인라이닝에 대해 여러 컴파일러 옵션을 사용합니다.
    • 범위 밖의 자동 변수를 사용합니다.
    • 내장 함수를 호출하거나 대상 아키텍처에서 지원하지 않는 내장 함수에 대해 인수 형식을 전달합니다.
    • 네이티브 wchar_t를 사용하는 코드와 wchar_t를 사용하지 않은 코드를 혼합했습니다.

LNK2038

Mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease'
  • 사용하는 라이브러리들의 런타임 라이브러리를 일치시켜야 한다.
  • 관련 플래그는 /MT, /MD이다.

LNK2038

error LNK2038: '_ITERATOR_DEBUG_LEVEL'에 대해 불일치가 검색되었습니다.
'0' 값이 '2'(C.obj에 위치) 값과 일치하지 않습니다.

Release모드에서 _DEBUG가 설정되어있을 수 있다. NDEBUG와 같은 관련 매크로를 확인해보자.

LNK4217

  • 지역으로 정의된 'symbol' 기호를 'function' 함수로 가져왔습니다.
  • 기호가 지역으로 정의되어 있지만 기호에 대해 __declspec(dllimport)가 지정되었습니다. __declspec 한정자를 제거하여 이 경고를 해결하십시오.

R6034

An application has made an attempt to load the C runtime library incorrectly.
...

DLL과 같은 Runtime library와 관련된 오류가 발생된 경우 이러한 오류가 발생된다. depends와 같은 유틸리티를 사용하여 종속성을 해결하거나 Manifest를 수정해야 한다.

Not found ssize_t

#if defined(_MSC_VER)
#include <BaseTsd.h>
typedef SSIZE_T ssize_t;
#endif

링크 단계에 아래와 같은 경고가 발생될 수 있다.

LINK : warning LNK4076: '.\Debug/프로젝트이름.ilk' 증분 상태 파일이 잘못되었습니다. 비증분 링크합니다.

해당 파일을 지우고 다시 빌드하면 된다.

See also

References


  1. Visual_studio-LNK4099_LNK4204_warning.zip