42서울에서 주어진 라이브러리를 이용해 프로젝트를 진행하려는데, 내 로컬 M1 맥에서
symbol(s) not found for architecture arm64
에러가 나면서 컴파일이 되지 않는 일이 발생했다.
구글링해보니 42의 라이브러리는 넷와이드 어셈블러
(nasm, 인텔 x86 아키텍처용 어셈블러이자 역어셈블러)로 작성되어서 내 M1 맥으로는 인텔 노트북처럼 컴파일이 되지 않았던 것이었다.
해결법은 실행하고자 하는 명령어 앞에 arch -x86_64
명령어를 붙여주는 것. 예를 들면 아래와 같이 해주면 된다.
arch -x86_64 gcc -L../mlx -lmlx -framework OpenGL -framework Appkit main.c
이 예시는 42의 minilibx라는 라이브러리를 사용하면서 컴파일하는 명령어다. 그대로 Makefile의 all에 넣어서 편리하게 사용 중이다.
본래 arch 명령어는 시스템의 CPU
에 대한 정보를 확인하는 명령어다. 메뉴얼을 번역해보면 아래와 같다.
arch [-32] [-64] [[-arch_name | -arch arch_name]...] [-c] [-d envname]... [-e envname=value]... [-h] prog [args ...]
위와 같은 프로토타입을 갖는데, prog
인자가 바로 내가 원래 실행하고자 하는 명령어다. 또, 아까 예시에선 arch_name
이 곧 x86_64
인 것.
코로나 때문에 집에서 내 맥북으로 코딩을 하려니 이런 오류도 접하고 덕분에 아키텍처에 대한 공부도 할 수 있었다.
나의 코딩 선생님 구글 땡큐!
📚 참고
http://seyong.me/macos/run-x86-terminal-app-with-apple-silicon/#fn:2