gcc는 extrenal linkage init 할 때 문제가 발생합니다
236
작성한 질문수 3
답변 2
2
아하,
코드를 보니 12_8_extern_init_2.c (main함수가 없는 부분)에
777로 초기화하신 것 같네요.
12_8_extern_init.c에서 초기화한 뒤에 12_8_extern_init_2.c로 끌어다 써야 하는 것이 맞습니다.
extern g_int는 외부에 선언된 g_int를 끌어다 쓰겠다는 의미입니다.
변수를 위해 메모리를 따로 할당하겠다는 말이 아니지요.
이를 main 함수가 없는 파일에 초기화하면 당연히 multiple definition 에러가 뜹니다.
아래와 같이요.
minchul@minchul:~/workspace/DBC-QnA/src$ gcc -o test 12_8_extern_init.c 12_8_extern_init_2.c
12_8_extern_init_2.c:3:12: warning: ‘g_int’ initialized and declared ‘extern’
3 | extern int g_int = 777; // Warning or Error!!
| ^~~~~
/usr/bin/ld: /tmp/ccMHNtnJ.o:(.data+0x0): multiple definition of `g_int'; /tmp/ccU9Sjja.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
그래서 main 함수가 있는 12_8_extern_init에서 g_int를 초기화하고
12_8_extern_init_2.c에서 이를 extern으로 (초기화하는 것이 아닌) 끌어다 써야 합니다.
아래 코드를 작성하고 실행해보세요.
12_8_extern_init.c
// 초기화한다
int g_int = 777;
void testFunc();
int main() {
testFunc();
return 0;
}
12_8_extern_init_2.c
#include <stdio.h>
// 끌어다 쓴다
extern int g_int;
void testFunc() {
printf("g_int == 777 == %d\n", g_int);
}
올바르게 실행된 예시는 다음과 같습니다.
minchul@minchul:~/workspace/DBC-QnA/src$ gcc -o test 12_8_extern_init.c 12_8_extern_init_2.c
minchul@minchul:~/workspace/DBC-QnA/src$ ./test
g_int == 777 == 777
0
우선 답변 감사드립니다.
안타깝게도 제 질문은 그것이 아니었습니다.
해당 강의(12.8강)의 18:21 부분부터 시작되는 문제를 말씀드린 것이었습니다.
Translation Unit 외의 부분에서 extren 키워드와 함께 정의(혹은 선언 및 할당)
즉, 일종의 초기화를 한다면 경고와 오류를 발생시키지만,
MSVC 2019와 IBM 컴파일러에선 문제가 안 되는 것 같아
혹시 제가 무언가를 놓치고 있는 건지, 그게 아니라면
이 내용은 수정을 하는 것이 어떤지 등의 의견을 구하고자 하는 것이었습니다.
오늘 제가 직접 2019는 아니지만 MSVC 2022 Community에서 빌드 후 실행해보니
워닝조차 뜨지 않고 정상 작동 하더군요.
상당히 복잡한 문제인 것 같습니다.
0
이해했습니다.
extern 변수의 초기화는 말씀하신대로 컴파일러마다 차이가 있는 것으로 보이네요.
gcc는 (extern 본연의 의미답게) 외부의 변수를 참조하는 형태로만 사용하길 권하는 것으로 보입니다.
추후 개발을 하실 적에도 extern 변수를 초기화 하고 외부 linked된 변수를 정의만 하기보다는
변수를 초기화하고, extern 변수로 끌어다 사용하는 방향으로 개발하시길 권합니다.
감사합니다.
Export template 안됨
1
66
2
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
99
3
main 함수에서 왜 int만 선언이 되는걸까요
1
86
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
83
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
81
1
프로토타입과 함수간의 인자 불일치
1
87
2
12.12 헤더 관련 질문
1
74
2
Visual Studio Community 2026 사용 문의
1
172
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
73
2
getchar(), putchar()
1
112
3
강의자리ㅛ
1
93
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
134
2
소스파일안에 여러 파일
1
89
2
F5와 F7의 차이
1
93
2
c = TWO * (a+b); 에서 a와 b는?
1
69
2
; 세미콜론을 붙이는 기준에 문의
1
78
1
Step over 기능 문의
1
66
2
2.6 강의 따옴표 출력 규칙 문의
1
88
2
int main 함수 관련 오류 문의
1
82
2
13.4 words[0]
0
74
2
11.7 함수를 구현해 봤습니다.
1
67
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
74
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
62
2
11.6 fit_str함수를 구현해 봤습니다.
1
60
2





