Browse Info:header not sent MacでSDLアプリケーションの作り方 - おめが?日記

おめが?日記

2008-05-12

[][][]MacSDLアプリケーションの作り方 02:22


抜けてるかもしれないけどまとめるよ!!

目標としては、Windows環境下でexeとdllと適当なリソースぽいぽいっと入れてOKみたいな、お手軽パッケージ。ユーザ側に別個ライブラリ等のインストールを要求しないのがいいよね、と。

SDL

とりあえずとにかく動かしたい!!

  • ビルド
    • フラグlinuxと全く同様に
      • CFLAGS=`sdl-config --cflags`
      • LDFLAGS=`sdl-config --libs`
    • 必要に応じて LDFLAGSに -lSDL_mixer とか追加してください
  • 利点
  • 欠点
    • /opt/usr/lib あたりとリンクしているので、実行環境側でもmac portが必要
    • 配布には不向き

frameworkとリンクする

  • SDL_framework
    • 本家libSDLのページで Runtime Library : MacOSX
      • framework本体の動的リンクライブラリとヘッダ群。実行に必要
    • DevelopmentLibraries の SDL-devel-x.xx.x-extra.dmg
      • エントリポイントになるSDLmainがNIBlessフォルダにあるので、取っておく
  • インストール
    • SDL.frameworkフォルダを/Library/Frameworksに入れる(日本語環境下では/ライブラリ/frameworks)
  • ビルド
    • 事前にSDL-develから取り出した NIBless/SDLmain.m をコンパイルして SDLmain.o を用意する
    • コンパイラフラグにframeworkのヘッダを指定
    • リンカのフラグにframeworkを指定
      • CFLAGS=-I/Library/Frameworks/SDL.framework/Headers
      • LDFLAGS=-Wl,-framework,SDL SDLmain.o
    • 必要に応じてSDL_mixerなども同様に書き足す
    • 最後に SDLmain.o をリンクするのを忘れずに
  • 利点
  • 欠点
    • 単独で動くにはまだ
    • Finder経由で起動すると、ターミナル窓が立ち上がって、ちょっとかっこわるい

.app形式にする

  • .app形式とは
  • 基本はframeworkとリンクしてやって、あと.app形式固有の対処をするます
  • .appを作る
    • とりあえず構造
      • mkdir hoge.app
      • mkdir hoge.app/Contents
      • mkdir hoge.app/Contents/Frameworks
      • mkdir hoge.app/Contents/MacOS
      • mkdir hoge.app/Contents/Resources
    • hoge.app/Contents/Frameworks
      • /Library/Frameworksと同様の扱いのところ
        • ここに必要なframeworkを入れておく。ここではSDL.frameworkやSDL_mixer.frameworkを入れる
        • frameworkは足りなくてもいい。足りない場合はいつも通り/Library/Frameworksを探しにいく
    • hoge.app/Contents/MacOS
    • hoge.app/Contents/Resources
      • リソースを入れるところ、らしい
      • ぶっちゃけなくても動いてるし、他の場所にリソース置いても大丈夫だった
  • カレントディリクトリ問題
    • .app形式で起動すると.appが置いてあるフォルダがカレントディリクトリになる
      • イメージ的にはターミナルからhoge.app/Contents/MacOS/hoge で起動してる感じ
      • ので、起動時にカレントディリクトリを変更するコードを書き足す必要がある
      • ディリクトリ情報は第一引数から取得

Dの場合(dHell併用)

	version (Darwin)
	{
		public int main(char[][] args) {
			string path = args[0];
			std.file.chdir( path[0 .. (rfind( path , "/" ) + 1)] );
			return Hell_main(args);
		}
	}
	else
	{
		public int main(char[][] args){
			return Hell_main(args);
		}
	}

Cの場合

#include <string.h>
#include <unistd.h>

//
// 略
//

int main(int argc, char *argv[])
{
	car AppPath[1024];
	car AppPathw[1024];
	car *char_work;
	it strlen;

	i ( argc > 0 ) // change dir to .app/Contents/MacOS 
	{
		strcpy( AppPath, argv[0] );
		char_work = strrchr( AppPath, '/' );
		strlen = char_work - AppPath;
		strncpy( AppPathw, AppPath, strlen );
		AppPathw[strlen] = '\0';
		chdir( AppPathw );
	}

こんな感じ?

  • 利点
    • frameworkを同梱できるので、単一ファイルで配布できる
    • frameworkを別個インストールしてもらうこともできる
    • Finderから起動できる
  • 欠点
    • ?

.appをテストしたり他いろいろ

--->hoge.app/Contents/MacOS/hoge

    • とすると、ディリクトリ構成が同じ状況で起動できる + stdoutが見れる
  • .appにアイコンを付ける
    • 128x128の透過付き画像を用意
    • 画像を適当なビュワー(標準でついているプレビューでよい)で開いて、全体をコピー(cmd+A cmd+C)
    • .appをFinderで選んで「情報を見る」(cmd+i)
    • ペースト(cmd+v)
  • .appの中が見たい
    • ターミナル大好きっ子はそのままcdなりlsなり
    • Finderから見る場合は、右クリックメニューから「パッケージの内容」
  • 手っ取り早くパッケージを調べたい人は、既に動いているパッケージの中身を見るのがおすすめ

おまけ。ライブラリとstatic-linkする

static-linkするとライセンスによっては配布時に問題が発生するので注意。

  • ./configure --enable-static ; make でライブラリビルド
  • そうすると、スタティックリンク用のlibhoge.aファイルが生成される
    • /.libsに生成されるときもあるので探す
  • プロジェクトのリンク時に gcc -L/(libhoge.aへのパス) -lhoge とか渡してリンクする
トラックバック - http://d.hatena.ne.jp/o_mega/20080512/1210612958