X-Deep/32 用の Windows アプリの作り方

[戻る]

私にとってのX-Deep/32の用途は 適当な Linux マシンに接続し, そこで走らせたプログラムの表示だけ Windows マシンに出すことです. っが, [スタート]-[プログラム]-[X-Deep_32 4.0]-[X Clients] の下 を覗くと Windows で動く X アプリが転がっています. これらの実行形式の 実体はD:/utils/xdeep32_40/usr/X11R6/bin/ の下にあるわけです ( 黄緑部分はインストールした場所なので, 環境依存).

これってどうやったら作れるんだろうかと興味を持って調べた時の Tips です.

一番簡単な方法は cygwin を使う方法です. 適当に make して実行形式を作り, cygwin の bash から

% tgif -display 127.0.0.1:0
とでもやれば display オプションがあるアプリでは起動・表示されます (事前に X-Deep/32 を開いておく必要があります).

さらに, いちいち bash を起動するのが面倒くさい場合は,

  1. 実行形式を D:/cygwin/usr/X11R6/bin へコピー
  2. さらに, cygwin1.dll も上記ディレクトリにコピー
  3. 以下のコマンドを実行するメニューやバッチファイルを作る
    D:\utils\xdeep32_40\usr\utils\xcl.exe 'D:\cygwin\usr\X11R6\bin\oclock.exe' -d 127.0.0.1:0.0
    
とすればいいようです.

しかし, この方法は cygwin べったりです. 実行にあたっては cygwin1.dll やら cyg11-6.dll やらが必要です. 個人で使う分にはかまわないのですが, 実行形式を配布して, 他人に使ってもらおうとすると問題が出そうです. っとゆーわけで, VC で作れんもんかいと調べてみました.

結論を先に言うと, できたことはできたのですがあまり良くないです. 理由は

  1. cygwin 付属の dll は要らなくなったものの, X-Deep/32 付属の dll が必要になりました. まぁ dll を同時配布しないのであれば, 「cygwin と X-Deep/32 両方インストールしてね」から 「X-Deep/32 だけインストールしてね」になった分多少マシに なったかもしれませんが, cygwin だって (昔はそうとう使い勝手の悪かった, 今は知らない) X を持ってるわけだし, 似たり寄ったりでしょう.
  2. 実行ファイルを作るためには X-Deep/32 付属のライブラリをリンクしますが, それを第三者に配布していいのかどうか, ライセンスが良く分かりません
  3. UNIX 用に作られたコードを, VC でコンパイルすると, 例えば SIGALRM など互換性のないコードがある. これらをいちいち Windows の流儀に書き換えないといけない.

以上の欠点を踏まえた上で, せっかく見つけたんでやり方を書いておきます.

  1. ソースの文字コードを SJIS に変更 (EUC だと妙な所でエラーになる)
  2. コンソールプロジェクトを開いて, ソースをすべてプロジェクトに追加する
  3. プロジェクト全体を「プリコンパイル済みヘッダーを使用しない」モードにする.
  4. さらにプロジェクトの C/C++ において, D:\utils\xdeep32_40\usr\include を インクルードディレクトリに追加する.
  5. コンパイルが通るまでソースをいじる (まだリンクは通らなくていい). また, xcl 経由で起動するとカレントディレクトリが exe の位置にないので, その辺も調整する必要があります.
  6. プロジェクトのリンカに「追加の依存ファイル」というのがあるから, D:\utilsxdeep32_40\usr\lib の下にある必要な ファイルを指定する (x11.lib と xext.lib くらいだと思うが, 正確にはオリジナルの Makefile に書かれてる).
  7. コンパイル (正確にはリンク) をする.
もちろん, 書き方次第では「プリコンパイル済みのヘッダー」が使用できますが, ここでは単純化のため省きました. また, 実行にあたっては D:\utilsxdeep32_40\usr\X11R6\bin 以下の リンクした lib と同名の dll が必要なようです.


2006.10