質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.52%

作成したプログラムを使って、CMakeでカスタムターゲットを使ってファイルを生成したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,563

katahiromz

score 81

 前提・実現したいこと

こんにちは。

Visual C++ 2008, MSYS2+MinGW, cmake version 3.8.0-rc4を使って、「リソーエディタ(RisohEditor)」というプログラムを作っています。いわゆるWin32開発用のリソースエディタというものです。

リソーエディタ
https://github.com/katahiromz/RisohEditor

そこで問題ですが、src/CMakeLists.txtに問題があって、

src/CMakeLists.txt
https://github.com/katahiromz/RisohEditor/blob/master/src/CMakeLists.txt

ソリューション「RisohEditor」のプロジェクト「RisohEditor」をビルドしたときに、自動的にカスタムターゲット「messagetables」を実行するようにしたいのですが、どうすればいいですか。

ターゲット「messagetables」は、このソリューションが含んでいる「mcdx」というプログラムが必要ですので、「messagetables」を実行する前に、プロジェクト「mcdx」をビルドする必要があります。

 発生している問題・エラーメッセージ

1>------ すべてのリビルド開始: プロジェクト: ZERO_CHECK, 構成: Debug Win32 ------
1>プロジェクト 'ZERO_CHECK'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
1>Checking Build System
1>CMake does not need to re-run because C:/Users/katahiromz/Documents/DEV/RisohEditorProject/RisohEditor/CMakeFiles/generate.stamp is up-to-date.
1>CMake does not need to re-run because C:/Users/katahiromz/Documents/DEV/RisohEditorProject/RisohEditor/src/CMakeFiles/generate.stamp is up-to-date.
1>CMake does not need to re-run because C:/Users/katahiromz/Documents/DEV/RisohEditorProject/RisohEditor/tests/CMakeFiles/generate.stamp is up-to-date.
1>CMake does not need to re-run because C:/Users/katahiromz/Documents/DEV/RisohEditorProject/RisohEditor/mcdx/CMakeFiles/generate.stamp is up-to-date.
1>ビルドログは "file://c:\Users\katahiromz\Documents\DEV\RisohEditorProject\RisohEditor\ZERO_CHECK.dir\Debug\BuildLog.htm" に保存されました。
1>ZERO_CHECK - エラー 0、警告 0
2>------ すべてのリビルド開始: プロジェクト: RisohEditor, 構成: Debug Win32 ------
2>プロジェクト 'RisohEditor'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
2>Building Custom Rule C:/Users/katahiromz/Documents/DEV/RisohEditorProject/RisohEditor/src/CMakeLists.txt
2>CMake does not need to re-run because C:/Users/katahiromz/Documents/DEV/RisohEditorProject/RisohEditor/src/CMakeFiles/generate.stamp is up-to-date.
2>コンパイルしています...
2>Samples.cpp
2>RisohEditor.cpp
2>PackedDIB.cpp
2>コードを生成中...
2>リソースをコンパイルしています...
2>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
2>Copyright (C) Microsoft Corporation.  All rights reserved.
2>マニフェストをリソースにコンパイルしています...
2>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1
2>Copyright (C) Microsoft Corporation.  All rights reserved.
2>リンクしています...
2>LINK : fatal error LNK1104: ファイル 'messagetables.res' を開くことができません。
2>ビルドログは "file://c:\Users\katahiromz\Documents\DEV\RisohEditorProject\RisohEditor\src\RisohEditor.dir\Debug\BuildLog.htm" に保存されました。
2>RisohEditor - エラー 1、警告 0
========== すべてリビルド: 1 正常終了、1 失敗、0 スキップ ==========

見ての通り、「ファイル 'messagetables.res' を開くことができません。」というエラーメッセージが表示されます。

 該当のソースコード

# enable Win32 resource
ENABLE_LANGUAGE(RC)

# include directories
include_directories(../include)

# RisohEditor.exe
add_executable(RisohEditor WIN32 
    PackedDIB.cpp
    RisohEditor.cpp
    Samples.cpp
    RisohEditor_res.rc)
target_link_libraries(RisohEditor comctl32 msimg32 winmm gdiplus vfw32)

# messagetables.res
add_custom_target(messagetables
    mcdx RisohEditor_res.rc messagetables.res
    DEPENDS mcdx 
    BYPRODUCTS messagetables.res
    COMMENT [[ mcdx RisohEditor_res.rc messagetables.res ]]
    VERBATIM)
add_dependencies(RisohEditor messagetables)
set_target_properties(RisohEditor PROPERTIES LINK_FLAGS messagetables.res)

target_compile_definitions(RisohEditor PRIVATE -DUNICODE -D_UNICODE)

# do statically link
set_target_properties(RisohEditor PROPERTIES LINK_SEARCH_START_STATIC 1)
set_target_properties(RisohEditor PROPERTIES LINK_SEARCH_END_STATIC 1)

 試したこと

CMakeをトップディレクトリから実行して、生成されるソリューションをVisual C++ 2008で開いて、RisohEditorプロジェクトをビルド。src/CMakeLists.txtを何度編集しても成功せず。

 補足情報

ファイル「messagetables.res」は、トップディレクトリの「build」の中に生成しなければいけません。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

こんにちは。

add_dependenciesでいけると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/11 22:14

    ソースを見ての通り、すでにadd_dependenciesを書いてあるのに、機能していません。

    キャンセル

  • 2018/02/11 22:18

    あらら、見落としてました。すいません。もう少し考えてみます。

    キャンセル

  • 2018/02/11 22:36

    私のプロジェクトで試しにadd_dependenciesをコメントアウトしてみると、Visual Studioのソリューション・エクスプローラの「ビルドの依存関係」→「プロジェクトの依存関係」のチェックが外れ、コメントアウトを復活するとチェックが回復しました。
    add_excutableとadd_custom_target間の依存関係です。

    後は、CMakeのバージョンが少し気になります。RC4ではなく正規リリース版を使ってみては如何でしょうか?
    今回はCMake 3.10で確認しましたが、このプロジェクトはCMake 3.5.0くらいから正常にビルドできています。

    キャンセル

check解決した方法

0

add_custom_targetにALLを付けて、"messagetables.res"を"../build/messagetables.res"に修正すると、正常に処理できました。

# enable Win32 resource
ENABLE_LANGUAGE(RC)

# include directories
include_directories(../include)

# RisohEditor.exe
add_executable(RisohEditor WIN32 
    PackedDIB.cpp
    RisohEditor.cpp
    Samples.cpp
    RisohEditor_res.rc)
target_link_libraries(RisohEditor comctl32 msimg32 winmm gdiplus vfw32)

# messagetables.res
add_custom_target(messagetables ALL
    mcdx RisohEditor_res.rc ../build/messagetables.res
    DEPENDS mcdx 
    BYPRODUCTS ../build/messagetables.res
    COMMENT [[ mcdx RisohEditor_res.rc ../build/messagetables.res ]]
    VERBATIM)
add_dependencies(RisohEditor messagetables)
add_dependencies(messagetables mcdx)
set_target_properties(RisohEditor PROPERTIES LINK_FLAGS ../build/messagetables.res)

target_compile_definitions(RisohEditor PRIVATE -DUNICODE -D_UNICODE)

# do statically link
set_target_properties(RisohEditor PROPERTIES LINK_SEARCH_START_STATIC 1)
set_target_properties(RisohEditor PROPERTIES LINK_SEARCH_END_STATIC 1)

ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • C++に関する質問
  • 作成したプログラムを使って、CMakeでカスタムターゲットを使ってファイルを生成したい