visual 스튜디오에서 기호 기호가 여러 번 정의된 해결 방법 (오류 LNK 1169)

3997 단어
기호 기호는 이미 여러 번 정의되었다.
이 오류 후 오류 LNK 1169 입니다.

가능한 원인 및 솔루션


일반적으로 이 오류는 정의된 규칙을 끊어야 한다는 것을 의미합니다. 이것은 전체 실행 가능한 파일에 사용된 템플릿, 함수, 유형, 대상이 주어진 대상 파일에 있고 외부에 보이는 대상이나 편지만 정의할 수 있도록 합니다.
다음은 이 오류의 흔한 원인들입니다.
  • 헤더 파일이 변수를 정의할 때 이 오류가 발생할 수 있습니다.예를 들어 프로젝트에 여러 개의 원본 파일에 이 헤더 파일을 포함하면 오류가 발생합니다: h복제
    // LNK2005_global.h
    int global_int;  // LNK2005
    
    가능한 해결 방안은 다음과 같습니다.
  • 변수 성명extern 헤더 파일에서: extern int global_int;을 정의한 다음 필요에 따라 원본 파일 하나만 초기화합니다: int global_int = 17;.이 변수는 현재 전역입니다. 모든 원본 파일에서 그것을 성명할 수 있습니다. 예를 들어 헤더 파일을 포함합니다.우리는 변수에 대해 반드시 전역적인 이 해결 방안이 되어야 한다고 건의하지만, 양호한 소프트웨어 공학 실천은 전역적인 변수를 최대한 줄여야 한다.
  • 변수를 정태적으로 표시한다: extern.이것은 현재 대상 파일에서 정의된 역할 영역으로 제한되며, 여러 대상 파일이 자신의 변수 복사본을 가지고 있도록 허용합니다.헤더 파일에 혼동될 수 있는 전역 변수를 정적 변수로 정의하는 것을 권장하지 않습니다.정적 변수의 정의를 원본 파일로 옮기는 것을 더 좋아합니다.
  • 변수를 selectany: static int static_int = 17;에 성명합니다.이렇게 하면 모든 외부 참조에서 정의를 선택하여 나머지 부분을 사용하고 버릴 수 있음을 링크에 알립니다.병합된 가져오기 라이브러리에서 이 해결 방안은 때때로 유용합니다.그렇지 않으면, 우리는 링크기의 오류를 피하기 위해 이렇게 하는 것을 일종의 방법으로 건의하지 않습니다.

  • 헤더 파일이 함수가 아니라고 정의할 때 이 오류가 발생합니다 __declspec(selectany) int global_int = 17;.여러 원본 파일에 이 헤더 파일을 포함하면 실행 파일에서 여러 개의 정의 함수를 얻을 수 있습니다.h 복제
    // LNK2005_func.h
    int sample_function(int k) { return 42 * (k % 167); }  // LNK2005
    
    가능한 솔루션은 다음과 같습니다.
  • 함수 추가inline 키워드: 복제
    ```h
    // LNK2005_func_inline.h
    inline int sample_function(int k) { return 42 * (k % 167); }
    ```
    
  • 헤더 파일의 함수체를 삭제하고 성명만 보존한 다음에 원본 파일의 함수를 하나 실현한다. 복사
    ```h
    // LNK2005_func_decl.h
    int sample_function(int);
    ```
    
    ```cpp
    // LNK2005_func_impl.cpp
    int sample_function(int k) { return 42 * (k % 167); }
    ```
    
  • 헤더 파일에 클래스 성명의 외부 구성원 함수를 정의하면 이 오류가 발생할 수 있습니다. h복제
    // LNK2005_member_outside.h
    class Sample {
    public:
        int sample_function(int);
    };
    int Sample::sample_function(int k) { return 42 * (k % 167); }  // LNK2005
    
    이 문제를 해결하려면 클래스의 구성원 함수를 정의합니다.클래스 성명에 정의된 구성원 함수는 스텔스 내연을 진행했습니다.h복제
    // LNK2005_member_inline.h
    class Sample {
    public:
        int sample_function(int k) { return 42 * (k % 167); }
    };
    
  • 여러 CRT의 표준 라이브러리 버전을 링크한 경우 이 오류가 발생할 수 있습니다.예를 들어 실행 가능한 파일과 동시에 CRT 라이브러리나 라이브러리의 정적 버전과 동적 버전, 표준 라이브러리의 두 가지 다른 버전을 소매하고 디버깅하려고 시도하면 이 오류를 보고할 때가 많다.이 문제를 해결하려면 링크 명령에서 모든 라이브러리의 하나만 남아 있는 복사본을 삭제하십시오.같은 실행 가능한 파일의 다른 버전의 소매와 디버그 라이브러리나 라이브러리를 혼용하는 것을 권장하지 않습니다.링크기 명령줄에 기본값이 아닌 값을 사용하도록 알리려면 사용할 라이브러리/NODEFAULTLIB 옵션을 지정하고 기본 라이브러리를 비활성화합니다.IDE에서 항목에 지정한 라이브러리를 인용해서 사용하고 속성 페이지를 열어 항목에 사용하십시오. 대화상자 링크기, 입력 속성 페이지에서 모든 기본 라이브러리를 무시하거나 특정한 기본 라이브러리 속성을 무시하고 기본 라이브러리를 비활성화합니다.
  • 정적 라이브러리와 동적 라이브러리를 혼합해서 사용하면 오류/clr 옵션이 발생할 수 있습니다.예를 들어, 에서 사용 중인 DLL에서 실행 파일의 정적 CRT에 대한 링크를 생성하면 이 오류가 발생할 수 있습니다.이 문제를 해결하려면 정적 라이브러리만 사용하거나 동적 라이브러리 전체 실행 파일만 사용하거나 실행 가능한 파일에서 사용할 라이브러리를 생성합니다.
  • 기호가 패키지된 함수인 경우 이 오류(컴파일할 때 생성된/Gy)가 여러 파일에 포함되지만 컴파일 간에 변경될 수 있습니다.이 문제를 해결하려면 봉인된 함수를 포함하는 모든 파일을 다시 컴파일하십시오.
  • 서로 다른 라이브러리의 두 구성원 대상에서 서로 다른 방식으로 기호를 정의하고 이 두 구성원 대상을 사용하면 이 오류가 발생할 수 있습니다.이 문제를 해결할 때 정적 링크 라이브러리의 한 가지 방법은 구성원 대상에 하나의 라이브러리만 사용하고 이 라이브러리를 먼저 링크 명령줄에 포함시키는 것이다.이 두 기호를 사용하려면 구분하는 방법을 만들어야 합니다.예를 들어 원본을 생성할 수 있는 라이브러리는 유일한 명칭 공간의 모든 라이브러리에 포장할 수 있다.또는 원본 라이브러리 중 하나에 대한 참조를 고유한 이름으로 포장하고 새 라이브러리를 원본 라이브러리에 링크한 다음 원본 라이브러리의 실행 가능한 파일이 아닌 새 라이브러리에 링크하는 새 패키지 라이브러리를 만들 수 있습니다.
  • 이 오류가 발생할 수 있는 경우inline 변수는 두 번 정의되었고 정의마다 다른 값을 가진다.이 문제를 해결하려면 상수를 유일하게 정의하거나 이름공간을 사용하거나 extern const 상수 정의를 구분해야 합니다.
  • uid를lib은 Guid 정의(예: oledb.lib 및adsiid.lib)와 기타입니다.lib 파일, 이 오류가 발생할 수 있습니다.예를 들어 Output 복제
    oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject
    already defined in uuid.lib(go7.obj)
    
    를 통해 이 문제를 해결하려면/FORCE:MULTIPLE를 링크 명령줄에 추가하고 uiid를 확보하십시오.lib은 참조의 첫 번째 라이브러리입니다.
  • 좋은 웹페이지 즐겨찾기