M1 맥에서 mlx(minilibX) 실행하기 (42 cub3d/miniRT)

seomoon·2021년 2월 2일
1

TIL (Today I Learned)

목록 보기
12/12

M1 맥에서 minilibX 실행하기

mlx openGL 버전

42서울 cub3D나 miniRT 과제를 진행하려면
minilibX 라이브러리를 실행해야 한다.

먼저 인트라의 cub3D/miniRT 프로젝트 페이지에서 minilibx_opengl.tgz 버전을 다운받는다.
압축을 풀어서 프로젝트 루트에 위치시키고, 폴더 이름을 mlx로 변경한다. (폴더 이름 변경은 선택)

mlx 라이브러리를 포함해 컴파일하려면 기본적으로는 아래와 같이 입력하면 된다.

gcc *.c -I. -Lmlx -lmlx -framework OpenGL -framework Appkit

( *-I 헤더파일 경로, -L mlx 라이브러리 경로(mlx 폴더 이름), -l 라이브러리파일 이름(앞의 lib와 뒤의 .a를 제외한 이름) )

그런데 M1 맥북일 경우

ld: warning: ignoring file mlx/libmlx.a, building for macOS-arm64 but attempting to link with file built for macOS-x86_64
Undefined symbols for architecture arm64

이런 warning이 발생하면서 컴파일이 안된다.

이 문제는 arch 명령어를 사용해 아키텍쳐를 arm64 -> x86_64로 전환해서 해결할 수 있다.

arch -x86_64 gcc *.c -I. -Lmlx -lmlx -framework OpenGL -framework Appkit

mlx를 빌드할 때 생기는 OpenGL deprecation 관련 warning들은 무시해도 된다. (cub3d/miniRT 에서 사용하지 않는 mlx 함수와 관련된 warning들이기 때문)

그래도 신경쓰인다면 OpenGL 대신 Metal 프레임워크를 사용하면
deprecated warning이 뜨지 않는다.
(Metal은 OpenGL의 기능을 완전히 대체하면서 성능이 더 개선된 그래픽 API로, 2012 이후 출시된 모든 맥에서 지원됨. / https://ko.wikipedia.org/wiki/%EB%A9%94%ED%83%88_(API) )

arch -x86_64 gcc *.c -I. -Lmlx -lmlx -framework Metal -framework Metalkit

mlx mms 버전 (beta 버전)

mlx beta 버전에서는 get_screen_size() 함수를 사용할 수 있다. beta 버전을 사용하려면 인트라의 프로젝트 페이지에서 minilibx_mms_20200219_beta.tgz 파일을 다운받아서
마찬가지로 압축을 풀고 프로젝트 루트에 위치시키면 된다.

디렉토리명은 mlx_beta로 변경하고 진행했다.

베타 버전은 arm64 아키텍처에서도 실행이 되기 때문에
arch 명령어를 사용하지 않아도 된다.

gcc *.c -I. -Lmlx_beta -lmlx -framework Metal -framework Metalkit

beta 버전은 정적 라이브러리 .a 가 아닌 동적 라이브러리 .dylib 로 구성되기 때문에
opengl 버전과 똑같이 컴파일하면 dyld: Library not loaded: libmlx.dylib 에러가 발생할 수 있다.

동적 라이브러리.dylib 는 정적 라이브러리.a와 달리
컴파일 할 때 동적라이브러리의 내용이 실행파일에 포함되지 않고
실행할 때 포함이 되기 때문에 발생하는 에러이다.

해결방법은 두 가지가 있다.
Makefile에서 install_name_tool 명령어로
libmlx.dylib의 path를 설정해준다.
아니면 그냥 프로젝트 루트 디렉토리에 libmlx.dylib 파일을 두고 컴파일하면 된다.

cub3D를 아직 구현하지 않았다면

구현을 시작하기 전에

  • taelee님의 mlx_example (https://github.com/taelee42/mlx_example)
  • lodev의 레이캐스팅 예제(C++)를 C로 포팅한 l-yohai님의 github (https://github.com/l-yohai/cub3d)

둘 중에 한 곳을 클론해서 먼저 mlx가 제대로 실행되는지 확인해보면 좋다.

mlx_example에서는 mlx의 기본적인 기능들을 실행해볼 수 있고(창 띄우기, 이미지 띄우기 등)
lodev 예제로는 텍스쳐가 없는 민무늬 벽부터 시작해서 천장과 바닥 캐스팅, 텍스쳐, 스프라이트까지 단계적으로 실행해볼 수 있다.

profile
안녕하세요

관심 있을 만한 포스트

0개의 댓글