링커 도구 오류 LNK2005Linker Tools Error LNK2005

개체에 기호가 이미 정의 되어 있습니다.symbol already defined in object

기호 기호가 두 번 이상 정의 되었습니다.The symbol symbol was defined more than once.

이 오류 다음에는 심각한 오류 LNK1169이 발생 합니다.This error is followed by fatal error LNK1169.

가능한 원인 및 해결 방법Possible causes and solutions

일반적으로이 오류는 특정 개체 파일에서 사용 되는 템플릿, 함수, 형식 또는 개체에 대해 하나의 정의만 허용 하 고 외부에서 볼 수 있는 개체 또는 함수의 전체 실행 파일에 대해 하나의 정의만 허용 하는 정의 규칙 하나를 중단 했음을 의미 합니다.Generally, this error means you have broken the one definition rule, which allows only one definition for any used template, function, type, or object in a given object file, and only one definition across the entire executable for externally visible objects or functions.

이 오류의 몇 가지 일반적인 원인은 다음과 같습니다.Here are some common causes for this error.

  • 헤더 파일에서 변수를 정의 하는 경우이 오류가 발생할 수 있습니다.This error can occur when a header file defines a variable. 예를 들어 프로젝트의 둘 이상의 소스 파일에이 헤더 파일을 포함 하는 경우 오류가 발생 합니다.For example, if you include this header file in more than one source file in your project, an error results:

    // LNK2005_global.h
    int global_int;  // LNK2005
    

    가능한 솔루션은 다음과 같습니다.Possible solutions include:

    • 헤더 파일에서 변수를 선언 하 고 extern extern int global_int; , 정의 하 고, 필요에 따라 소스 파일 하나에만 초기화 int global_int = 17; 합니다.Declare the variable extern in the header file: extern int global_int;, then define it and optionally initialize it in one and only one source file: int global_int = 17;. 이 변수는 이제 헤더 파일을 포함 하 여 모든 소스 파일에서 선언 하 여 사용할 수 있는 전역입니다 extern .This variable is now a global that you can use in any source file by declaring it extern, for example, by including the header file. 전역적 이어야 하는 변수에는이 솔루션을 권장 하지만 좋은 소프트웨어 엔지니어링 방법은 글로벌 변수를 최소화 하는 것입니다.We recommend this solution for variables that must be global, but good software engineering practice minimizes global variables.

    • 정적변수를 선언 static int static_int = 17; 합니다.Declare the variable static: static int static_int = 17;. 이는 정의의 범위를 현재 개체 파일로 제한 하 고 여러 개체 파일에서 고유한 변수 복사본을 가질 수 있도록 합니다.This restricts the scope of the definition to the current object file, and allows multiple object files to have their own copy of the variable. 전역 변수와 혼동 될 수 있으므로 헤더 파일에 정적 변수를 정의 하지 않는 것이 좋습니다.We don't recommend you define static variables in header files because of the potential for confusion with global variables. 정적 변수 정의를이를 사용 하는 소스 파일로 이동 하는 것이 좋습니다.Prefer to move static variable definitions into the source files that use them.

    • Selectany변수를 __declspec(selectany) int global_int = 17; 선언 합니다.Declare the variable selectany: __declspec(selectany) int global_int = 17;. 이렇게 하면 링커에서 모든 외부 참조에서 사용할 정의를 하나 선택 하 고 나머지를 삭제할 수 있습니다.This tells the linker to pick one definition for use by all external references and to discard the rest. 이 솔루션은 가져오기 라이브러리를 결합할 때 유용할 수 있습니다.This solution is sometimes useful when combining import libraries. 그렇지 않으면 링커 오류를 방지 하는 방법으로 사용 하지 않는 것이 좋습니다.Otherwise, we do not recommend it as a way to avoid linker errors.

  • 헤더 파일이이 아닌 함수를 정의 하는 경우이 오류가 발생할 수 있습니다 inline .This error can occur when a header file defines a function that isn't inline. 이 헤더 파일을 둘 이상의 소스 파일에 포함 하는 경우 실행 파일에서 함수에 대 한 여러 정의를 가져옵니다.If you include this header file in more than one source file, you get multiple definitions of the function in the executable.

    // LNK2005_func.h
    int sample_function(int k) { return 42 * (k % 167); }  // LNK2005
    

    가능한 솔루션은 다음과 같습니다.Possible solutions include:

    • inline 함수에 키워드를 추가 합니다.Add the inline keyword to the function:

      // LNK2005_func_inline.h
      inline int sample_function(int k) { return 42 * (k % 167); }
      
    • 헤더 파일에서 함수 본문을 제거 하 고 선언만 유지 한 다음 하나의 소스 파일에만 함수를 구현 합니다.Remove the function body from the header file and leave only the declaration, then implement the function in one and only one source file:

      // LNK2005_func_decl.h
      int sample_function(int);
      
      // LNK2005_func_impl.cpp
      int sample_function(int k) { return 42 * (k % 167); }
      
  • 헤더 파일의 클래스 선언 외부에 멤버 함수를 정의 하는 경우에도이 오류가 발생할 수 있습니다.This error can also occur if you define member functions outside the class declaration in a header file:

    // LNK2005_member_outside.h
    class Sample {
    public:
        int sample_function(int);
    };
    int Sample::sample_function(int k) { return 42 * (k % 167); }  // LNK2005
    

    이 문제를 해결 하려면 멤버 함수 정의를 클래스 내에서 이동 합니다.To fix this issue, move the member function definitions inside the class. 클래스 선언 내에 정의 된 멤버 함수는 암시적으로 인라인 됩니다.Member functions defined inside a class declaration are implicitly inlined.

    // LNK2005_member_inline.h
    class Sample {
    public:
        int sample_function(int k) { return 42 * (k % 167); }
    };
    
  • 이 오류는 표준 라이브러리 또는 CRT의 둘 이상의 버전을 연결 하는 경우에 발생할 수 있습니다.This error can occur if you link more than one version of the standard library or CRT. 예를 들어 정품 및 디버그 CRT 라이브러리나 라이브러리의 정적 및 동적 버전을 모두 또는 두 개의 다른 버전의 표준 라이브러리를 실행 하는 경우이 오류가 여러 번 보고 될 수 있습니다.For example, if you attempt to link both the retail and debug CRT libraries, or both the static and dynamic versions of a library, or two different versions of a standard library to your executable, this error may be reported many times. 이 문제를 해결 하려면 링크 명령에서 각 라이브러리의 복사본을 하나만 제외 하 고 모두 제거 합니다.To fix this issue, remove all but one copy of each library from the link command. 일반 정품 및 디버그 라이브러리나 라이브러리의 다른 버전을 동일한 실행 파일에 혼합 하지 않는 것이 좋습니다.We do not recommend you mix retail and debug libraries, or different versions of a library, in the same executable.

    링커에서 기본값 이외의 라이브러리를 사용 하도록 지시 하려면 명령줄에서 사용할 라이브러리를 지정 하 고 /nodefaultlib 옵션을 사용 하 여 기본 라이브러리를 사용 하지 않도록 설정 합니다.To tell the linker to use libraries other than the defaults, on the command line, specify the libraries to use, and use the /NODEFAULTLIB option to disable the default libraries. IDE에서 프로젝트에 대 한 참조를 추가 하 여 사용할 라이브러리를 지정 하 고 프로젝트에 대 한 속성 페이지 대화 상자를 연 다음 링커입력 속성 페이지에서 모든 기본 라이브러리 무시또는 특정 기본 라이브러리 무시 속성을 기본 라이브러리를 사용 하지 않도록 설정으로 설정 합니다.In the IDE, add references to your project to specify the libraries to use, and then open the Property Pages dialog for your project, and in the Linker, Input property page, set either Ignore All Default Libraries, or Ignore Specific Default Libraries properties to disable the default libraries.

  • /Clr 옵션을 사용 하는 경우 정적 라이브러리와 동적 라이브러리를 함께 사용 하는 경우이 오류가 발생할 수 있습니다.This error can occur if you mix use of static and dynamic libraries when you use the /clr option. 예를 들어 정적 CRT에 연결 되는 실행 파일에서 사용할 DLL을 빌드하는 경우이 오류가 발생할 수 있습니다.For example, this error can occur if you build a DLL for use in your executable that links in the static CRT. 이 문제를 해결 하려면 정적 라이브러리 또는 전체 실행 파일에 대해 동적 라이브러리만 사용 하 고 실행 파일에서 사용 하기 위해 빌드하는 라이브러리에만 사용 합니다.To fix this issue, use only static libraries or only dynamic libraries for the entire executable and for any libraries you build to use in the executable.

  • 이 오류는 기호가 /gy로 컴파일하여 생성 된 패키지 함수이 고 둘 이상의 파일에 포함 되었지만 컴파일 간에 변경 된 경우에 발생할 수 있습니다.This error can occur if the symbol is a packaged function (created by compiling with /Gy) and it was included in more than one file, but was changed between compilations. 이 문제를 해결 하려면 패키지 함수를 포함 하는 모든 파일을 다시 컴파일하십시오.To fix this issue, recompile all files that include the packaged function.

  • 이 오류는 다른 라이브러리의 두 멤버 개체에서 기호가 다르게 정의 되 고 두 멤버 개체가 모두 사용 되는 경우에 발생할 수 있습니다.This error can occur if the symbol is defined differently in two member objects in different libraries, and both member objects are used. 라이브러리가 정적으로 연결 된 경우이 문제를 해결 하는 한 가지 방법은 한 라이브러리의 멤버 개체를 사용 하 고 링커 명령줄에 해당 라이브러리를 먼저 포함 하는 것입니다.One way to fix this issue when the libraries are statically linked is to use the member object from only one library, and include that library first on the linker command line. 두 기호를 모두 사용 하려면 구분 하는 방법을 만들어야 합니다.To use both symbols, you must create a way to distinguish them. 예를 들어 원본에서 라이브러리를 빌드할 수 있는 경우 각 라이브러리를 고유한 네임 스페이스로 래핑할 수 있습니다.For example, if you can build the libraries from source, you can wrap each library in a unique namespace. 또는 고유 이름을 사용 하 여 참조를 원래 라이브러리 중 하나로 래핑하고 새 라이브러리를 원본 라이브러리에 연결한 다음 원래 라이브러리 대신 새 라이브러리에 실행 파일을 연결 하는 새 래퍼 라이브러리를 만들 수 있습니다.Alternatively, you can create a new wrapper library that uses unique names to wrap references to one of the original libraries, link the new library to the original library, then link the executable to your new library instead of the original library.

  • extern const변수를 두 번 정의 하 고 각 정의에 다른 값이 있는 경우이 오류가 발생할 수 있습니다.This error can occur if an extern const variable is defined twice, and has a different value in each definition. 이 문제를 해결 하려면 상수를 한 번만 정의 하거나 네임 스페이스 또는 enum class 정의를 사용 하 여 상수를 구분 합니다.To fix this issue, define the constant only once, or use namespaces or enum class definitions to distinguish the constants.

  • Guid (예: oledb 및 adsiid .lib)를 정의 하는 다른 .lib 파일과 함께 uuid를 사용 하는 경우이 오류가 발생할 수 있습니다.This error can occur if you use uuid.lib in combination with other .lib files that define GUIDs (for example, oledb.lib and adsiid.lib). 예를 들면 다음과 같습니다.For example:

    oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject
    already defined in uuid.lib(go7.obj)
    

    이 문제를 해결 하려면 링커 명령줄 옵션에 /force: MULTIPLE 을 추가 하 고, uuid가 첫 번째로 참조 된 라이브러리 인지 확인 합니다.To fix this issue, add /FORCE:MULTIPLE to the linker command line options, and make sure that uuid.lib is the first library referenced.