qmakeでlreleaseがエラー

64ビットWindowsを使っていて、32ビットのコマンドプロンプトやエクスプローラからqmake関係を起動するとおかしくなることがある。qmakeに限らず、64ビット環境での64ビットアプリと32ビットアプリでは環境変数などが一部異なるので、ビルド環境では64ビットの純正コマンドプロンプトやエクスプローラを使ったほうがよい。

コモンコントロールの適当なまとめ

コモンコントロールとはWindowsOSによって提供される基本的な機能を持ったウインドウ。ツリーやリストなど。コモンコントロールはバージョンアップが重ねられており、バージョンの違いでヘッダファイルにも違いが出る。開発環境と実行環境で違うバージョンがインストールされている場合もある。コモンコントロールはIEのインストールでバージョンアップされる。

https://msdn.microsoft.com/en-us/library/windows/desktop/hh298349(v=vs.85).aspx

実体

実体はComCtl32.dll。C:\Windows\System32\ComCtl32.dllにある。

ヘッダ

C言語のヘッダファイルでは_WIN32_IEにより、構造体などの定義が変わる。多くの構造体はそのサイズを持ち、この値がどんどん増えていく。この定数は_WIN32_WINNTの設定によって自動で設定される。_WIN32_WINNTを設定しなければ0x0500(version 5.80)になるようだ。SDKによって変わる。参照

コモンコントロールウインドウの作成

コモンコントロールのDLLがウインドウクラスを登録し、ユーザはこのクラスでCreateWindowExすることにより作成する。 InitCommonControlsEx()を呼ぶと、クラスの登録が行われるがDLLのロード時に行われるのかもしれない。

Visual Styles

Visual Stylesはコモンコントロールの表示スタイル(見栄え)を変える。

I18N

コモンコントロールの言語を変えるにはInitMUILanguage()を呼ぶ。

サイドバイサイド

ComCtrl32.dllはハードリンクされている。

WinSxSはサイドバイサイドのアセンブリが置かれているところで長い名前はComCtrl32.dllのアセンブリアイデンティを表している。アプリケーションが特定のバージョンのdllを読み込みたい場合はマニフェストにこのアイデンティを指定する。

このpragmaのつけたexeを起動すると、C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.16299.371_none_5d75084fa7e1cb96\comctl32.dllが使われる。このファイルはハードリンクをこの1つしか持っていない。ver6のコモンコントロールを使うにはマニフェストで指定するしかないことになる。

CygwinからWindowsアプリを起動する

explorerでカレントディレクトリを開く

これは普通に動くが、かなり特殊条件もあって動いている。explorerは起動されたプロセスが開くのではなかったり(開く場合もある)、”.”を理解してちゃんと開いてくれる。それにcygpath(cygwinの形態のパス変換)の問題もない。

TE32.exeでカレントディレクトリを開く

TEはプロセスがなければ自分で開くのでcygwinシェルから普通に起動するとシェルがブロックする。&をつけてバックグラウンドで動かしてもシェルがプロセスを管理しているため、cygwinの終了と同時に終了してしまう。nohubを使う手もあるかもしれないがここではスルー。

プロセスの起動はコマンドプロンプトのstartコマンドで行えばプロセス起動後すぐに終了するので上記の問題はない。しかしstartはビルドインプロセスのようでcygwinからは起動できない。そこでcmd /C startで起動すればいい。

パスの返還はcygwinのcygpath -waコマンドで行う。-aはフルパス、-wはWindows形態に変える。

よってカレントディレクトリをTE32.exeで開くには以下のように行う。

‘””‘はstartに””を送っている。startコマンドの性質上こうしている。

これでcygwinシェルから切り離されたプロセスと起動できたが何らかの環境変数などは継承しているかもしれない。

上記のコマンドはパスにスペースが含まれた場合を考慮していないので、その場合は””でくくらないとならないと思う。

qmakeの.proファイルの基礎

qmakeのproファイルの書き方

proファイルの名前

hello.proを作成すると、プロジェクト名がhelloになり出来上がる実行ファイル名もhello.exeになる。

ソースファイルを追加

SOURCES変数にファイルを追加する。

スペースで区切って複数指定してもいい、\ (バックスラッシュ)を行末につけて複数行にすることもできる。

ヘッダファイルを追加

HEADERS変数にファイルを追加する。

WindowsとLinuxで処理を分ける

{ は条件と同じラインに書かなければならない。

ファイルが存在しないときにエラーを表示する

デバッグモードを指定する

CONFIG変数にdebugと設定する。

WindowsのデバッグモードでqDebug()をコンソールに出力する

変数の設定と参照

変数は自分で書いてもいい。参照するには $$ を用いる。

インクルードパスの指定

コメント

# で始めるとコメントになる。

プロジェクトのタイプを指定(アプリかライブラリか)

TEMPLATE変数を使う。

  • app ⇒ アプリケーション
  • lib ⇒ ライブラリ

デフォルトはapp

CONFIGにいろいろ設定

  • qt ⇒ qtライブラリを使う
  • windows ⇒ WindowsのGUIアプリケーション
  • console ⇒ Windowsのコンソールアプリケーション

Qtライブラリを指定

QT変数を使う。

coreとguiはデフォルトで設定される。デフォルトから外したいときは += ではなく = を使う。あるいは -= を使う。

Featureを使う

Featureとは.prfで記述される特別な機能。CONFIGに機能を設定して使用する。

pkg-configを利用して、D-Busとoggライブラリを利用する。

Qt以外のライブラリの指定

ライブラリをつくる

ライブラリをつくるにはTEMPLATE変数にlibを設定する。そのうえでCONFIG変数でライブラリのタイプを指定する。

  • dll ⇒ ライブラリはDLL
  • staticlib ⇒ ライブラリはスタティックライブラリ
  • plugin ⇒ ライブラリはプリグイン

環境変数の取得

$$(ENVVAL)を使う。

Foxit Readerをアプリから起動すると警告が出る

Foxit Readerは比較的軽量なPDFリーダー。Adobe Readerの代わりに使える。

アプリケーションからPDFをFoxit Readerを開くと以下のような警告が出る。

これは署名されていないアプリケーションから起動するとこれが出るようだ。チェックボックスをチェックしても消えない。

これを消すにはファイル ⇒ Preferencesからダイアログを開いて以下の場所でアプリケーションの実行ファイルと登録する。(日本語版ではTrust Managerは「信頼マネージャ」)

フォームをリソースエディタで開こうとするとエラーになる (C++/CLI)

ヘッダファイルをダブルクリックしてリソースエディタで開こうとするとエラーになる。

これはヘッダーファイルの最初のクラスが当該フォームでないため。以下のソースのように前方参照(ref class)を使っていてもうまく動かない。

前方参照を別ファイルに分離

これを回避するには前方参照の部分だけのヘッダーをつくり、それをインクルードすればよい。

前方参照だけのヘッダーheaderref.h

もとのヘッダー

.NET Frameworkのマルチターゲットの話

適当に書くので参考までに。

マルチターゲット

アプリのビルドの際にいろいろなターゲットを指定できる能力のこと。ターゲットには以下の内容が含まれる

  • .NET Frameworkのバージョン(Target Framework)
  • プロセッサ(Target platform)
  • 上の2つを合わせてTarget contextと呼ぶ。

Toolset

ターゲットとコンパイラを合わせてToolsetと言う。ToolsVersionと同じ。

参照アセンブリ

ツールセットで指定される。C:\Program Files\Reference Assemblies\Microsoft\Frameworkにあるアセンブリを参照する。ここにあるアセンブリは実装を持たず機能があるかだけを表す。

ToolsVersion

VSのプロジェクトファイルには以下の内容が含まれる。

15.0は使うMSBuildのバージョンだがVS2013以降はこの値は使われず、VSのバージョンに合ったバージョンが使われる。MSBuildは互換性が高いのでこの値は対して意味がない。
VSのバージョンとToolsVersionの対応は以下

  • VS2010とVS2012 → 4.0
  • VS2013 → 12.0
  • VS2014 → 14.0
  • VS2017 → 15.0

14.0以前はレジストリにある以下のキーを参照する

15.0以降はレジストリは見ないで、以下のものを使う
C:\Program Files\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin

C++/CLIでWndProcを継承実装する

FormでWndProcを宣言する

実装する

ビルドするには/clrオプションを設定しなければならない。

実例ファイル

FFmpegで動画の音声をノーマライズする

Windowsで実験。python3.5でやった。

ffmpeg.exeへパスを張る

ffmpeg-normalizeをインストール

pythonのpipでffmpeg-normalizeをインストールする

対象ファイルのaudioコーデックを見つける

ffprobeでaudioコーデックを見つける。

出力のストリームからaudioコーデックを見つける。aacやvorbisなどがある。

normalizeする

ffmpeg-normalizeが見つからない場合は、pythonフォルダのScriptsにパスを張る。

参考(実行されるメインのffmpegコマンドライン)

参照

元のソース