MLX42 は、特定のオペレーティング システムのネイティブ ウィンドウ フレームワークを直接操作することなく、グラフィカル アプリケーションを作成するための、パフォーマンスが高く、使いやすい、クロスプラットフォームの最小限のウィンドウ グラフィック ライブラリです。
これは、ウィンドウ上にテクスチャを描画したり、ウィンドウに表示されるときに実行時にテクスチャを変更したりするための原始的なツールを提供します。
重要
場合によっては、長期間更新が行われていないように見える場合があります。これは予期されたことであり、プロジェクト/ライブラリは完了したものとみなされ、最小限の更新が必要になります。バグ修正は引き続き保証されており、プロジェクトは現在も積極的にメンテナンスされています。
MLX42 には、それを使用することを面倒ではなく実際に楽しくする機能が豊富に備わっています。
おばあちゃんの WindowsXP、叔父の Debian、流行に敏感な人の MacOS で実行してください。どのようなプラットフォームであっても、MLX42 をその上に構築できれば、ネイティブ ウィンドウ システム上で実行できます。
これにより、どのマシン上にあるプロジェクトでも作業できるようになります。
MLX42 は優れたドキュメントを重視しており、すべての機能、使用法、さらには一部の内部動作さえもドキュメント化されています。何かがどのように機能するか、または機能するはずであるかを推測したり検索したりする必要はもうありません。
これは OpenGL 上に構築されており、バッチ レンダリングを使用して他のライブラリと比較してレンダリング プロセスを高速化します。
このプロジェクトは、Codam と 42 Network の学生によって積極的に維持されています。これにより、学生はライブラリ自体について詳しく学び、潜在的なバグを単に受け入れるのではなく修正する直接の機会が得られます。
MLX42 では Emscripten との互換性が導入され、WebAssembly を通じて Web ブラウザで MLX42 を実行できるようになります。この変更は @PepeLevi のおかげで可能になりました。彼のフォークと貢献は彼の功績です。
このプロジェクトの構築は、すべてのシステム全体で次のようになります。 CMake が理解できる限り。
システムに glfw がインストールされていない場合、cmake がこれを検出してダウンロードします。その後、glfw の_depsディレクトリでsudo make install実行できます。 42 コンピュータ (MacOS、Linux) を使用している場合は、お気に入りのシステム管理者にインストールを依頼してください。 CMake やシステムに必要なその他の依存関係についても同様です。
ただし、どちらも実行できない場合でも、CMake は GLFW を取得してビルドすることができます。その後、 _depsフォルダーから静的にリンクできます。
注記
Codam の場合、GLFW はすでに Mac にインストールされています。
注記
リンク段階では、GLFW をリンクするためのフラグは、システムに応じて -lglfw3 または -lglfw のいずれかになります。
ライブラリを使用してプログラムをコンパイルします。
利益!
ライブラリを完全にビルドしてシステムにインストールするには、次のコマンドを実行します。
cmake -B build && cmake --build build --parallel --config (Debug | Release | RelWithDebInfo | MinSizeRel) --target installデフォルトでは、Windows ではインストールされたライブラリがC:Program Files (x86)mlx42に配置され、MacOS / Linux の場合はそれぞれ/usr/local/libと/usr/local/includeに配置されます。
MLX42 には、ライブラリの整合性を確認するためのいくつかの単体テストが付属しています。ライブラリをビルドするには、次のコマンドを実行します。
cmake -DBUILD_TESTS=ON -B build && cmake --build build --parallel次に、次のように実行します。
ctest --output-on-failure --test-dir buildgit clone https://github.com/codam-coding-college/MLX42.git
cd MLX42
cmake -B build # build here refers to the outputfolder.
cmake --build build -j4 # or do make -C build -j4出力ライブラリ ファイルはlibmlx42.aという名前で、指定したbuildフォルダーにあります。
ビルド オプションを cmake に渡すことができます (例: cmake -DDEBUG=1 -DGLFW_FETCH=0... )。これらにより、たとえば、DEBUG モードでビルドしたり、ビルド時にあらゆる種類の動作を変更したりできます。
ここのドキュメントに Makefile の例があります。
システムに GLFW も CMake もない場合は、brew を使用して不足している依存関係をインストールすることを強くお勧めします。
42 キャンパスの場合は、42Homebrew を使用できます。
それ以外の場合は自作の場合:
brew install glfw
brew install cmakeApple Silicon (M1 チップ以降) を使用している場合は、Homebrew のインストール パスが異なることに注意してください。シェル構成ファイルを更新することもできます。 Zsh ユーザーの場合 (新しい macOS バージョンのデフォルト シェル):
nano ~ /.zshrc
export LIBRARY_PATH=/opt/homebrew/lib変更を有効にするには、シェル セッションを再起動するか、ターミナルを再起動します。
MacOS の場合、プログラムを正しいフレームワークにリンクするには、次のフラグを使用してプログラムをライブラリでコンパイルする必要があります。
-framework Cocoa -framework OpenGL -framework IOKit通常、単にglfwソースからインストール/ビルドした場合、またはすでにインストールされている場合、コンパイルは次のようになります。
gcc main.c ... libmlx42.a -Iinclude -lglfw # Homebrew
gcc main.c ... libmlx42.a -Iinclude -lglfw -L " /opt/homebrew/Cellar/glfw/3.3.8/lib/ "
# 42Homebrew
gcc main.c ... libmlx42.a -Iinclude -lglfw -L " /Users/ $( USER ) /.brew/opt/glfw/lib/ " MacOS でプログラムを実行すると、エラーが発生する可能性があります。Mac では考え方を変える必要があるからです。セキュリティ警告が表示されたり、MacOS が作成者/開発者を確認できないことを通知したりする場合は、 Settings > Security & Privacyに移動します。
下部にアプリケーションが実行しようとしたことを知らせるポップアップが表示されます。オプションをクリックして実行させます。
Debian の場合 (Ubuntu、Mint、Pop OS...):
sudo apt update
sudo apt install build-essential libx11-dev libglfw3-dev libglfw3 xorg-devArch-linux (Manjaro、Endeavor、Garuda) の場合:
sudo pacman -S glfw-x11または (sway/wlroots コンポジターまたは他の wayland コンポジターを使用する場合)
sudo pacman -S glfw-waylandMLX42をダウンロードしてビルドする
ライブラリを使用してプログラムをコンパイルします。
gcc main.c ... libmlx42.a -Iinclude -ldl -lglfw -pthread -lm重要
これらすべての手順を開始する前に、これをお読みください
.zshrcまたは.bashrcに設定します。 export DISPLAY= $( ip route list default | awk ' {print $3} ' ) :0
export LIBGL_ALWAYS_INDIRECT=0(DISPLAY エクスポート コマンドが失敗する場合は、代替手段についてこの StackOverflow の投稿を参照してください)
拡張構成を使用して XServer アプリケーションをダウンロードしてインストールします (XMing は対象外です)。VcXsrv は動作します: https://sourceforge.net/projects/vcxsrv/
Windows Defender ファイアウォールを開き、次の手順に従います。
Native openglオプションのチェックを外しますDisable access control重要
これには Visual Studio (2022) が必要であることに注意してください。 Windows での開発は多少イライラすることがあります。
これをできるだけ簡単に行うために、単純に WSL2 を使用することを強くお勧めします。ただし、Windows 用にネイティブに構築することにこだわる場合、依存関係に関して必要なのは次のとおりです。
すべての依存関係を正しくインストールすると、 CMake Visual Studio プロジェクト ファイルが生成されます。単純にビルドし、 .libファイルを作成したら、それらを実際のプロジェクトに移動し、他のライブラリと同様にインストールします。
念のため、これを行う方法を説明するビデオをご覧ください。便利なことに、このビデオではglfwリンクする方法も説明しています。
もちろん、作成したコードが移植可能かどうかを確認するのはあなた次第です。 Unixに存在するものは、必ずしもWin32に存在するとは限りません。

// -----------------------------------------------------------------------------
// Codam Coding College, Amsterdam @ 2022-2023 by W2Wizard.
// See README in the root project for more information.
// -----------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <MLX42/MLX42.h>
#define WIDTH 512
#define HEIGHT 512
static mlx_image_t * image ;
// -----------------------------------------------------------------------------
int32_t ft_pixel ( int32_t r , int32_t g , int32_t b , int32_t a )
{
return ( r << 24 | g << 16 | b << 8 | a );
}
void ft_randomize ( void * param )
{
( void ) param ;
for ( uint32_t i = 0 ; i < image -> width ; ++ i )
{
for ( uint32_t y = 0 ; y < image -> height ; ++ y )
{
uint32_t color = ft_pixel (
rand () % 0xFF , // R
rand () % 0xFF , // G
rand () % 0xFF , // B
rand () % 0xFF // A
);
mlx_put_pixel ( image , i , y , color );
}
}
}
void ft_hook ( void * param )
{
mlx_t * mlx = param ;
if ( mlx_is_key_down ( mlx , MLX_KEY_ESCAPE ))
mlx_close_window ( mlx );
if ( mlx_is_key_down ( mlx , MLX_KEY_UP ))
image -> instances [ 0 ]. y -= 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_DOWN ))
image -> instances [ 0 ]. y += 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_LEFT ))
image -> instances [ 0 ]. x -= 5 ;
if ( mlx_is_key_down ( mlx , MLX_KEY_RIGHT ))
image -> instances [ 0 ]. x += 5 ;
}
// -----------------------------------------------------------------------------
int32_t main ( void )
{
mlx_t * mlx ;
// Gotta error check this stuff
if (!( mlx = mlx_init ( WIDTH , HEIGHT , "MLX42" , true)))
{
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
if (!( image = mlx_new_image ( mlx , 128 , 128 )))
{
mlx_close_window ( mlx );
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
if ( mlx_image_to_window ( mlx , image , 0 , 0 ) == -1 )
{
mlx_close_window ( mlx );
puts ( mlx_strerror ( mlx_errno ));
return ( EXIT_FAILURE );
}
mlx_loop_hook ( mlx , ft_randomize , mlx );
mlx_loop_hook ( mlx , ft_hook , mlx );
mlx_loop ( mlx );
mlx_terminate ( mlx );
return ( EXIT_SUCCESS );
}