작년에 MacBook Air m1으로 바꾸면서 이런저런 문제를 많이 겪었다.
일단 학교에서 당장 과제를 수행하는 어려움도 있었다(Oracle 사용 등).
그래도 m1을 지원하는 대체 프로그램이 있고, 빠른 속도로 업데이트를 해줘서 점점 불편함을 느끼지 못했다.
그런데도 여전히 m1은 사용자를 괴롭히고 있다.
(다행히 문제 해결하는게 재밌어서 후회는 안됨)
KMP 알고리즘을 구현하고 vscode로 make를 하는 과정에서 에러를 만났다.

ld: warning: ignoring file KMP.o, building for macOS-arm64 but attempting to link with file built for unknown-x86_64
Undefined symbols for architecture arm64:
"_KMP", referenced from:
_main in main.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [main] Error 1
일단 error를 만나면 clang: error: linker command failed with exit code 1 (use -v to see invocation) 가장 눈에 띄는 이 부분을 당장 구글링해서 해결책을 찾곤 하는데 사실은 첫줄부터 읽어 보아야 한다.
error의 내용인 즉슨,
KMP.o 파일이 무시되었다. 그 이유는 macOS-arm64로 빌드를 하는데 x86-64로 빌드해야 하는 파일을 링크하려고 했기 때문이다. 그리고 그 파일이 바로 KMP.o 이므로 무시되었다. 당연히 KMP.o 이 무시되었기 때문에 해당 소스코드가 포함되어야 할 main이 실행되지 못해서 결론적으로 link 오류가 난 것이다.
해당 소스코드를 컴파일한 건 인텔 기반 맥이었고,
실행을 m1 기반 맥에서 하려고 하니 이런 식으로 에러가 난 것.
프로그램이 어떤 아키텍처 기반으로 컴파일 되었는지 확인해보자.
터미널에서 lipo -archs ./{file name}.o 명령어로 확인해볼 수 있다.

출처: program이 arm64인지 x86_64인지?
% lipo -archs ./KMP.o
x86_64
% lipo -archs ./main.o
arm64
% lipo -archs ./inputString.o
arm64
그렇다. 정말 어떻게 된 일인지 KMP.o 파일만 인텔 아키텍처라고 한다.
make로 하면 안 되고
결국 다시 오브젝트 파일을 삭제하고 컴파일 하면 된다.
간단…
그런데 어째서 이런 일이
틀린 내용이 있거나, 다른 의견 있으시면 편하게 댓글 남겨주시면 감사하겠습니다.