月別アーカイブ: 2014年4月

Mac の Homebrew を使った実行ファイルのリリーステスト

まず、Homebrew で作った app ファイルをリリースしようとしたときに、自分の Mac では動作するのに、渡した人の Mac では動作しない、という問題に遭遇しました。
これは OpenCV を使っていて、libopencv_highgui.2.4.8.dylib が libopencv_core.2.4.dylib を利用していて、そのあたりの依存関係を install_name_tool で変更してなかった! というのが原因でした。

最初は

$ brew unlink opencv

で opencv を無効にしていたのですが、これだとリリース用のフォルダにある libopencv_highgui.2.4.8.dylib が直接 /usr/local/Cellar/opencv/2.4.8.2/lib/libopencv_core.2.4.dylib に依存していたのを、自分の Mac では検出できません。
(unlink は Cellar と /usr/local/ とのシンボリックリンクを削除)

それで、思いついたのが以下の方法です!

$ cd /usr/local/
$ mv Cellar Cellar_orig

我ながら「強引だな!」と思います。
で、この方法でリリース用フォルダのプログラムが実行できることを確認したら、忘れずに以下のコマンドで Cellar を元に戻します。

$ mv Cellar_orig Cellar

まぁ、そもそもコマンドラインでビルドしてリリースするのが良くないんじゃないかな、とは思っています。(コマンドラインでなく XCode を使うとか?

悩ましいです…。

Qt で Windows のタスクバーにアプリ名を表示させないようにする

Qt でマスコット系のアプリを作っていると、タスクバーにアプリ名が表示されるのを抑制したいことがあります。(抑制すると Alt-Tab を押したときにも表示されなくなる) そういう場合、単に

#if defined(Q_OS_WIN)
    WId wid = winId();
    LONG style = GetWindowLong(wid, GWL_EXSTYLE);
    SetWindowLong(wid, GWL_EXSTYLE, style | WS_EX_TOOLWINDOW);
#endif

を追記してもよいのですが QWidget::setWindowFlags() が SetWindowLong() を呼び出しているせいか、設定がうまく反映されなかったりしました。

仕方がないので、タスクバーへのアプリ名表示を抑制する Widget クラスに(例えば Balloon_widget) の setWindowFlags() をオーバーライドして、以下のようにしました。

void Balloon_widget::setWindowFlags(Qt::WindowFlags flags)
{
    QWidget::setWindowFlags(flags);
#if defined(Q_OS_WIN)
    WId wid = winId();
    LONG style = GetWindowLong(wid, GWL_EXSTYLE);
    SetWindowLong(wid, GWL_EXSTYLE, style | WS_EX_TOOLWINDOW);
#endif
}

親クラスのメソッドを呼び出してから、setWindowLong() を呼び出すようにしただけですが、こんな感じでうまくいきます。