VsCode 맥os C언어 링크 오류 해결법 - Undefined symbols for architecture arm64:

2023. 12. 27. 20:51C언어

소스 코드

 

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

 


참고한 글:

https://stackoverflow.com/questions/15441877/how-do-i-link-object-files-in-c-fails-with-undefined-symbols-for-architecture/35413842#35413842

 

https://stackoverflow.com/a/15622496

'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