2017-07-20 28 views
1

私はこのプロジェクトをコンパイルしようとしています:https://github.com/shaochuan/cmake-protobuf-example。私は正常にmsvc2015(x64)でprotobufをコンパイルしました。チェックプロジェクトはエラーなしで実行されます(すべての結果:合格)。Protobuf:message.pb.hファイルにインクルードファイルcommon.hを開くことができません

Protobuf_INCLUDE_DIR = C:/ TK /いるProtobuf-330/msvc2015_64 /インストール/含む Protobuf_LIBRARY_DEBUG = C:/ TK /いるProtobuf-330/msvc2015_64

Iが設けられ、すべてのパスをcmakeのプロジェクトを設定します/install/lib/libprotobufd.lib Protobuf_LITE_LIBRARY_DEBUG = C:/TK/protobuf-330/msvc2015_64/install/lib/libprotobuf-lited.lib Protobuf_PROTOC_EXECUTABLE = C:/ TK /いるProtobuf-330/msvc2015_64 /インストール/ binに/ protoc .exeの Protobuf_PROTOC_LIBRARY_DEBUG = C:/TK/protobuf-330/msvc2015_64/install/lib/libprotocd.lib Protobuf_SRC_ROOT_FOLDER = C:\ TK \ SRC \いるProtobuf-330 \ SRC

proto-projectはエラーなしでコンパイルされます。これにはmessage.ccとmessage.hファイルが含まれています。

INCLUDE(FindProtobuf) 
FIND_PACKAGE(Protobuf REQUIRED) 
INCLUDE_DIRECTORIES(${PROTOBUF_INCLUDE_DIR}) 
PROTOBUF_GENERATE_CPP(PROTO_SRC PROTO_HEADER message.proto) 
ADD_LIBRARY(proto ${PROTO_HEADER} ${PROTO_SRC}) 

私はCMakeLists.txtを以下の主なプロジェクトをコンパイルした場合::

"Cannot open include file: 'google/protobuf/stubs/common.h': No such file or directory" c:\tktest\protobuftest\src\proto\message.pb.h 
を:

PROJECT(rpc) 
CMAKE_MINIMUM_REQUIRED (VERSION 2.6) 

ADD_SUBDIRECTORY(proto) 

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) 
ADD_EXECUTABLE(main main.cpp) 
TARGET_LINK_LIBRARIES(main proto ${PROTOBUF_LIBRARY}) 

を私はこれを構築する場合、エラーC1083が言って発生したCMakeLists.txtは次のようになります

ファイル内のエラー行は、

#include <google/protobuf/stubs/common.h> 
です。

何が間違っているのかわかりません。いくつかのヒントは高く評価されます。 cmake + protobuf + visual studio 2015に関するいくつかの問題を知っていますか? ありがとうございます。

+0

Macxxとユートピアのおかげです。プロジェクトのCMakeLists.txtの最後に提案された行を追加し、両方のプロジェクトのプロジェクトプロパティを「マルチスレッドデバッグ(/ MTd)」に変更しました。そして今、それは動作します。それでも問題が何かを把握することができました。どんな提案も大歓迎です。 – KabCode

答えて

0

私はprotobufについて何も知らないので、私はここで教育的な推測をするつもりです。

target_*コマンドを使用することをお勧めします。

プロトプロジェクトCMakeLists.txt:

target_include_directories(proto 
    PUBLIC 
    "${Protobuf_INCLUDE_DIRS}") 

言い、すべての任意にアクセスすることができますprotoターゲットを使用しても同様protoとして自分自身「$ {Protobuf_INCLUDE_DIRS}」にアクセスすることができ含みそれら。

+0

残念ながら、これは私の問題を解決しません。メインプロジェクトCMakeLists.txtは$ {PROTOBUF_LIBRARY}変数を設定していないようです。 – KabCode

+1

あなたの提案とMacxxが提供する行を追加しました。それが動作することを知っているおかげで – KabCode

0

私のPC上では、プロジェクトはコンパイルされていますが、リンクされていません。したがって、この問題を解決するには、ライブラリprotoがprotobufライブラリをリンクする必要があります。これは、私のPC上で動作します。この変更後proto/CMakeLists.txt

TARGET_LINK_LIBRARIES(proto ${PROTOBUF_LIBRARY}) 

に次の行を追加することによって行うことができます。あなたのCMakeLists.txtで

+0

私はあなたの提案だけでなく、ユートピアによって提供される行を追加しました。ありがとう – KabCode

1

あなたはProtobuf_LIBRARYまたはProtobuf_LIBRARIESProtobuf_INCLUDE_DIRまたはProtobuf_INCLUDE_DIRS(末尾のSに注意)とPROTOBUF_LIBRARYPROTOBUF_INCLUDE_DIRを置き換える必要があります。 CMakeの変数名は大文字と小文字が区別されます私はCMake 3.9のバージョンにチェックしました。 find_package(Protobuf)を使用して暗黙的に呼び出されるFindProtobuf.cmakeモジュールは、成功したときにそれらの変数を定義します。

+0

素晴らしい点。これは、非ローカル変数を除いて、どこでもデフォルトで小文字を使用する理由です。どこでも大文字で読むことは難しくなります。 – utopia

関連する問題