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 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
파일을 두고 컴파일하면 된다.
구현을 시작하기 전에
둘 중에 한 곳을 클론해서 먼저 mlx가 제대로 실행되는지 확인해보면 좋다.
mlx_example에서는 mlx의 기본적인 기능들을 실행해볼 수 있고(창 띄우기, 이미지 띄우기 등)
lodev 예제로는 텍스쳐가 없는 민무늬 벽부터 시작해서 천장과 바닥 캐스팅, 텍스쳐, 스프라이트까지 단계적으로 실행해볼 수 있다.
좋은 정보 감사합니다!!ㅎㅎ