プログラミング・ランダムメモ | |
64-bit Ubuntu上で32-bit用のOpenGLプログラムをクロスコンパイル これまで、Linux用バイナリを作るとき、32-bit用バイナリは32-bit Ubuntuで、64-bit用バイナリは、64-bit Ubuntuで、VirtualBox上で起動してコンパイルしていた。これだと、何が面倒かというと、同じLinux用のバイナリを作るのに、32-bit版、64-bit版でスクリプト一発でまとめて一気にできないのが面倒だった。同じOSなんだから、コマンド一発、ワンタッチで32-bitバイナリ、64-bitバイナリができて、アップロードするパッケージになってほしい。 gccのオプションで、-m32, -m64というオプションをつければ、強制的に32-bit, 64-bitを分けることができる、ということになっているが、64-bit Ubuntu上で-m32でコンパイルすると、コンパイル時にpredef.hが見つからないというエラーが出て、コンパイルできなかった。が、今日思い立って、そのpredef.hが見つからないというエラーはなんぞや、と、思って調べたところ、どうやら、multilibなるパッケージをインストールするとエラーが消えるらしいことがわかった。 その後調べると、他のライブラリも sudo apt-get install lib???:i386 によって32-bit用を追加できるらしいことがわかった。だったら、ちょっと手を換えれば、64-bit Ubuntu上で両方できちゃうんじゃないか。 と、思ったところ、問題発生。libGLとlibGLUが見つからないという。だったら、libgl1-mesa-dev:i386, libglu1-mesa-dev:i386をインストールすれば、と、思ったらエラーが出てできない。どうやら、調べたところ、これはUbuntuの既知のバグのようだ。 (続きを読む) 4-bit Indexed Colorに対応 とりあえず今までに思いついた中で、C++ constant inheritanceに一番近い解決法 C++で結構いろんな人が困ってる(らしい)問題のひとつに、const inheritance (勝手に命名。正式にこのように呼ばれてるのかどうかは知らない。)がある。検索した感じだと、read-only inheritanceとか呼んでる人もいるみたいだ。結構多くの人が似た様な問題に直面してるっぽいけど、僕が探した範囲では解決方法は見つからなかった。 どういうことかというと、例えば、 class YsShell { public: // Something useful }; class YsShellExt : private YsShell { public: operator const YsShell &() const; }; こういうことがしたい。YsShellクラスをprivate継承してYsShellExtを作りたいんだけど、ただ、const YsShell &への変換は自動的にやってほしい。YsShellExtはprivateにYsShellを継承してるけど、const YsShell &への変換はpublicだから、自動的にやってよ、と言いたいわけだが、これはできない。 (続きを読む) とにかく、単純に一本CPPファイルをプロジェクトに追加するだけでPNGがデコードできるようになるPNGデコーダを更新。バグフィックス。ユーザからのバグレポートに対応。無圧縮ブロックを読み込み中、スライディングウィンドウにデータをコピーしてなかった。 このPNGデコーダ、yspng.cppとyspng.hをプロジェクトに追加するだけで、お手軽簡単にPNG読み込み機能をプログラムに追加できる。g++ (4.4と4.6で動作確認)、clang、Visual C++ 2012で日常的にテストしているから、クロスプラットフォームな開発が必要な場面で役に立つ。PNGとLZ77の仕様を見ながら僕がゼロから書いたからGPL地雷は一切無し。「このPNGデコーダを使うには、○○ライブラリと○○ライブラリの○○バージョンが必要」みたいなメンテナンスの悪夢も一切無し。自分でも数々のプロジェクトでかなり長いこと使ってるし、結構世の中で使ってもらってるみたいだから、コードは鍛えられててかなり安定したと思う。というのが売りで、つい最近までGoogle検索すると検索結果トップに出ていたのに、今見たら2位になってた。
|
|