...의 다중 정의링커 오류
특수 파일을 정의했는데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
'programing' 카테고리의 다른 글
매개변수가 없는 함수(실제 함수 정의와 비교)는 왜 컴파일하는가? (0) | 2022.05.09 |
---|---|
GCC에서 std=c99 플래그 설정 (0) | 2022.05.09 |
Vuejs 경고 예상 부울 발견 문자열 (0) | 2022.05.09 |
GCC 문 표현식을 사용한 익명 함수 (0) | 2022.05.09 |
범위에서 랜덤 이중 생성 (0) | 2022.05.09 |