2023. 12. 27. 20:51ㆍC언어
소스 코드
main.c
#include <stdio.h>
extern void f2();
int main(void)
{
f2();
return 0;
}
sub.c
static void f1()
{
printf("f1()이 호출되었습니다.\n");
}
void f2()
{
printf("f2()가 호출되었습니다.\n");
}
main.c와 sub.c 파일을 간단히 설명하자면
sub.c 파일에 함수 f1과 f2를 만들고 f1함수는 static을 붙여 다른 파일, 즉 main.c 파일에서 외부연결을 하지 못하게 막아 놓았다.
f2 함수는 사용자가 저장 유형을 추가하지 않아 자동으로 auto 유형으로 정의되고 외부 파일에서 참조할 수 있는 형태이다.
main.c 파일에서 extern을 사용해 f2함수를 사용한다.
프로그램이 정상적으로 실행된다면 f2()가 호출되었습니다. 라고 출력될 것이다.
문제 (오류)
그러나 main.c 파일을 실행했을 때, 다음과 같은 오류 메세지가 출력되었다.
Undefined symbols for architecture arm64:
"_f2", referenced from:
_main in main-544212.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

대충 내용을 해석해보면 f2함수가 아키텍처 arm 64에 대한 정의되지 않은 기호라고 한다.
아마 main.c와 sub.c 파일이 제대로 링크되지 않아 생기는 문제인 것 같다.
해결방법
1.
main.c 파일에 #include <stdio.h> 아래에 #include "sub.c" 를 추가한다.
(아래는 수정된 코드이다.)
#include <stdio.h>
#include "sub.c"
extern void f2();
int main(void)
{
f2();
return 0;
}
이는 main.c 파일에 sub.c 파일을 포함시킨다는 의미이다.
수정 후 main.c 파일을 실행해보면 아래와 같이 정상적으로 출력이 되는 것을 확인할 수 있다.

그러나 위 코드의 취지는 굳이 include를 시키지 않고도 실행되는 것을 원하는 것이기 때문에 해결한거라고 보긴 어려울 것 같다.
2.
두번째 방법으로는 main.c와 sub.c 소스코드를 같이 컴파일 하여 실행파일을 생성하고, 그 실행파일을 실행하는 방법이다.
gcc 첫번째_소스코드.c 두번째_소스코드.c -o 실행파일_이름
위와 같은 형식으로 터미널에 입력해 주면 된다.
소스코드 이름은 main.c sub.c 이고, 실행파일 이름은 main 이라고 설정해 보도록 하겠다.
gcc main.c sub.c -o main

이렇게 명령어를 입력해주면 좌측 탐색기에 보이는 것처럼 main 이름의 실행파일이 하나 생성된 것을 볼 수 있다.

다른 실행파일들과 마찬가지로 Finder 에서 실행파일을 더블클릭해서 실행할 수도 있고,
vscode 내 터미널에서 실행하고 싶으면 ./실행파일_이름 명령어를 터미널에 입력하면 된다.
(main 실행파일을 실행하고 싶으니 ./main 이라고 입력하면 된다.)

위 사진과 같이 정상적으로 출력된 모습을 볼 수 있다.
사실 이 방법도 내가 직접 명령어를 입력해야 한다는 점에서 완벽하게 해결했다고는 볼 수 없을거 같다.
(원래는 딱 자동으로 링크되서 가져와야 하는데... ㅠㅠ)
그래도 일단 찾을 수 있는 해결방법이 이거밖에 없어서 2번째 방법을 사용하려고 한다.
만약 더 좋은 다른 방법을 찾으면 바로 글을 업데이트 할 예정이다.
(2023.12.27 수정)
mac 환경에서 vscode로 코드를 실행할 때는 자동 링크를 지원하지 않는다고 한다.
결론적으로 두번째 방법을 사용하는 것을 추천한다.
아래 글 참고.
https://stackoverflow.com/a/69835230
참고한 글:
'C언어' 카테고리의 다른 글
C언어 5주차 과제 (0) | 2023.04.10 |
---|---|
C언어 4주차 과제 (0) | 2023.04.10 |
C언어 3주차 과제 (0) | 2023.03.31 |
C언어 2주차 과제 (0) | 2023.03.25 |
C언어 1주차 과제 (0) | 2023.03.25 |