私はプロトコルバッファファイルがサブディレクトリにあるプロジェクトでFindProtobufモジュールを使用しています。そのサブディレクトリにあるCMakeLists.txtファイルにprotocを呼び出してCPPファイルを生成させます。マイプロジェクトフォルダ構造は次のようである:CMakeとFindProtobuf
cammy/CMakeLists.txt # Root CMakeLists.txt
cammy/protofiles/test.proto # protofile
cammy/protofiles/CMakeLists.txt
私は(FindProtobuf)、find_package呼び出しといるProtobufフォルダ内のCMakeLists.txtファイル内PROTOBUF_GENERATE_CPPへの呼び出しが含まれています。
実行可能なビルドステップはルートCMakeLists.txtファイルにあり、生成されたファイル をこのファイルの実行可能ファイルに追加します ie。私はcmakeのを実行すると
add_executable(${EXEC} ${SRCS} ${PROTO_SRC} ${PROTO_HEADER})
target_link_libraries(${EXEC} ${PROTOBUF_LIBRARIES})
が両方のルートCMakeLists.txtに
を定義している、それはソースが私がexpilicitlyことにより、依存関係を作成する実行可能ファイルに生成されたソースを結ぶにもかかわらず、ファイルを生成するprotocを実行しません。
protofilesフォルダ内のCMakeLists.txtのすべての内容をルートCMakeLists.txtに移動すると、protoファイルがコンパイルされます。
誰もがこれを手伝ってくれますか? protofilesフォルダに作成されたCMakeLists.txtファイルに、すべてのプロトコルバッファビルド用のものが必要です。
私はまた、内部のCMakeLists.txt(PROTO_SRCのような)で生成された変数が、印刷時に内側のファイルに定義されていることに気付きました(つまり、正しいCPPファイル名を取得します)。 。 それは空です。そのほとんどは、私が "export"(cmakeの方法があれば)の変数をルートフォルダにエクスポートする必要があるかのようです。
ご協力いただければ幸いです。
おかげ Kartik
ありがとうございます。要約すると、ネストされたprotoコンパイルがうまくいかない理由は、生成された変数がルークの範囲にないためです。また、親スコープ変数をルートファイルで設定する代わりにローカルスコープ変数を設定するときに、GENERATEDフラグをマークすることは可能ですか?最後に、protobufのものをライブラリとして構築し、それをルート実行可能ファイルにリンクする代わりの方法がありますか? –
@ KartikAiyer "ルークの範囲にない"という意味は分かりませんが、 "トップレベルのCMakeLists.txt"の範囲にない場合は、はいです。 Q2の場合は、親スコープで定義されているファイルにプロパティを設定する方法がないということは分かっています。 Q3のために、はい - 私はそれが良いアプローチだと信じています。 – Fraser
@Fraserあなたの答えをありがとう、私は似たような質問があります、私はプロジェクトを調整し、まだ動作しない、それは私にもっと提案を与える可能ですか? ref:http://stackoverflow.com/questions/29720410/no-member-found-when-use-cmake-construct-proto、サンプルプロジェクト:https://github.com/yuikns/cmake-proto –