programing

...의 다중 정의링커 오류

prostudy 2022. 5. 9. 21:57
반응형

...의 다중 정의링커 오류

특수 파일을 정의했는데config.h

내 프로젝트에는 다음과 같은 파일도 있다.

t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp

다음 항목:

T.C:

    #include "t.h"
    #include "b.h"
    #include "pp.h"
    #include "config.h"

b.c.에서:

    #include "b.h"
    #include "pp.h"

pp.c:

    #include "pp.h"
    #include "config.h"

L.cpp:

    #include "pp.h"
    #include "t.h"
    #include "config.h"

내겐 아무런 지시도 없다.*.h파일, 다음에서만*.c파일이야, 내가 이걸 구성으로 정의했어h:

const char *names[i] =
        {
            "brian", "stefan", "steve"
        };

l.cpp, t.c, pp.c에 그 배열이 필요하지만 나는 다음과 같은 오류를 얻는다.

pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1

나는 모든 곳에 경비원을 포함한다.*.h내 프로젝트에서 사용하는 파일.이 문제를 해결하는 데 도움이 되십니까?

머리글에 변수를 정의하지 마십시오.헤더에 선언문을 넣고 .c 파일 중 하나에 정의를 넣으십시오.

config.h에서

extern const char *names[];

일부 .c 파일:

const char *names[] = { 
  "brian", "stefan", "steve" };

헤더 파일에 전역 변수의 정의를 입력하면 이 정의는 이 헤더를 포함하는 모든 .c 파일로 이동하며, varible은 여러 번 선언될 수 있지만 한 번만 정의될 수 있기 때문에 다중 정의 오류가 발생한다.

또한 헤더 파일 내부에서 변수를 정의해야 할 경우 한 가지 더 수행할 수 있는 작업static키워드

static const char *names[] = {
  "brian", "stefan", "steve" };

이 방법 변수names전체 프로그램에서 한 번만 정의되며 여러 번 액세스할 수 있다.

공개 함수의 선언은 헤더 파일에 저장되지만, 정의는 헤더에도 절대적으로 유효하다!각 c 파일에서 다시 정의하지 않으려는 유틸리티 기능의 헤더에 있는 항목을 정의하는 경우, 당신은 정의를 정적(전체 프로그램에 대해 1개의 복사본만 허용)으로 선언할 수 있다.I.E. 열거형을 문자열로 변환하기 위한 열거형과 정적 함수를 정의한다.그러면 헤더가 포함된 각 .c 파일의 문자열 변환기에 열거형을 다시 쓸 필요가 없을 것이다.:)

헤더 파일에서 정의를 정적으로 만드십시오.

참조URL: https://stackoverflow.com/questions/17764661/multiple-definition-of-linker-error

반응형