CMakeでのPDBファイルの扱い

最近では,クロスプラットフォームなライブラリだとビルドツールとしてCMakeを使ってることが多いですね.

これはビルドツールというより,独自の設定ファイルから,プラットフォームネイティブなビルドツール用の設定ファイルなど(Makefileとかソリューションファイルとか)を出力する変換ツールです.

Visual Studioにも対応しているのですが,デバッグ情報の出力に関してバグがあります.

0014062: Setting Compiler and Linker PDB to the same path in Visual Studio is unsupported. – MantisBT

Visual Studio用にpdbファイルの出力先やファイル名を設定するPDB_OUTPUT_DIRECTORYとかPDB_NAMEというプロパティがあるのですが,従来のCMakeバージョンだとコンパイラが生成するPDBファイルとリンカが生成するPDBファイルの場所が同じで,場合によってはビルドが失敗することがありました.

で,最新バージョンの2.8.12.1(2013/11/11時点)ではこの問題を避けるためにコンパイラPDBのファイル名を指定する手段が削除されています.

VS: Separate compiler and linker PDB files (#11899, #14062)

This regresses the PDBDirectoryAndName test for STATIC libraries. Since it is not clear at this time what should be done for STATIC library .pdb files, comment out the relevant portion of the test and leave a TODO comment.

とあるので,いちおう暫定対応だとは思うのですがPDBファイル名を制御できないのは困ります.

現状では,PDB_OUTPUT_DIRECTORYPDB_NMAEはリンカPDBに対してのみ作用するので,DLLであればPDBファイル名を制御できるわけですが, スタティックライブラリに関してはデフォルトのファイル名でしか出力されないことになります.

まぁ,CMakeで出力したプロジェクトファイルに手で修正を加えてもいいのですが,不便なのでオリジナルのプロパティを追加するパッチを作ってみました.

cmake-2.8.12.1_pdb_mod.patch

一応バイナリも上げておきます(cmake-2.8.12.1-pdb_mod.7z).

このパッチによって以下の4つのターゲットプロパティが使えるようになります.

COMPILER_PDB_NAME
コンパイラPDBのファイル名を指定する(ClCompile/ProgramDataBaseFileName).
LINKER_PDB_NAME
リンカPDBのファイル名を指定する(Link/ProgramDatabaseFile).
GENERATE_COMPILER_PDB
on/offでコンパイラPDBの生成する/しない(offにするとProgramDataBaseFileNameを空にして 生成を抑止する.)
GENERATE_LINKER_PDB
on/offでリンカPDBの生成する/しない(Link/GenerateDebugInformation).

こんなモノを使っているとCMakeLists.txtの可搬性が無くなりますが,公式対応までのつなぎということで.あと,あんまりテストしてないので使用には注意です.

ビルド方法

必要なものは,CMakeのバイナリとQt5です. cmake-guiを使うことを前提とします.

以下の変数をセットする必要があります.

  • QT_QMAKE_EXECUTABLE※1
    • (QtRoot)/(version)/(platform)/bin/qmake.exe
    • 私の環境の例)C:/Qt/5.1.1/msvc2010/bin/qmake.exe
  • QtCore_DIR※1
    • (QtRoot)/(version)/(platform)/lib/cmake/Qt5Core
    • 私の環境の例)C:/Qt/5.1.1/msvc2010/lib/cmake/Qt5Core
  • QtWidgets_DIR※1
    • (QtRoot)/(version)/(platform)/lib/cmake/Qt5Widgets
    • 私の環境の例)C:/Qt/5.1.1/msvc2010/lib/cmake/Qt5Widgets
  • QT_LIBRARY_DIR※2
    • (QtRoot)/(version)/(platform)/lib/
    • 私の環境の例)C:/Qt/5.1.1/msvc2010/lib
  • QT_BINARY_DIR※2
    • (QtRoot)/(version)/(platform)/bin/
    • 私の環境の例)C:/Qt/5.1.1/msvc2010/bin
  • BUILD_TESTING※1
    • オフにしておく(オンのままだとQt4が必要です.)
  • BUILD_QtDialog※1
    • オンにしておく.
  • CMAKE_INSTALL_PREFIX※1
    • インストール先を設定する(デフォルトだとProgram Files以下となるので注意).

※1 一度configする必要がある.
※2 add entryで自分で定義する.データ型はPath.

この方法でBUILD_ALLをビルドし,さらにINSTALLプロジェクトをビルドすればインストール されますが,実行するためには一部のQt5バイナリを手動でコピーする必要があります.

  • qwindows.dll(qwindowsd.dll)
    • (QtRoot)/(version)/(platform)/plugins/platforms/にあります.
  • libEGL.dll(libEGLd.dll)
    • (QtRoot)/(version)/(platform)/binにあります.

(これらのファイルはLoadLibraryでロードされているようなので,cmakeのfixup_bundleでは認識されません.)

Leave a Reply