2017-07-20 7 views
1

Ich versuche, dieses Projekt zu kompilieren: https://github.com/shaochuan/cmake-protobuf-example. Ich habe Protobuf mit msvc2015 (x64) erfolgreich kompiliert. Das Prüfprojekt läuft ohne Fehler (Alle Ergebnisse: PASSED).Protobuf: Kann nicht öffnen Include-Datei common.h in message.pb.h Datei

stelle ich das Projekt in Cmake, vorausgesetzt alle Pfade:

Protobuf_INCLUDE_DIR = C:/TK/protobuf-330/msvc2015_64/install/include Protobuf_LIBRARY_DEBUG = C:/TK/protobuf-330/msvc2015_64 /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/install/bin/protok 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

Das Proto-Projekt wird ohne Fehler kompiliert. Es enthält die Dateien message.cc und message.h. Die CMakeLists.txt sieht wie folgt aus:

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}) 

Wenn ich das Hauptprojekt mit folgenden CMakeLists.txt kompilieren:

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}) 

Wenn ich das bauen der Fehler C1083 sagen aufgetreten:

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

In der Datei lautet die fehlerhafte Zeile:

#include <google/protobuf/stubs/common.h> 

Ich kann nicht herausfinden, was schief gelaufen ist. Einige Hinweise sind willkommen. Gibt es einige Probleme mit CMake + Protobuf + Visual Studio 2015? Vielen Dank im Voraus.

+0

Dank Macxx und Utopie. Ich habe beide vorgeschlagenen Zeilen am Ende des Protoprojekts CMakeLists.txt hinzugefügt und ändere die Projekteigenschaften beider Projekte in "Multi-threaded Debug (/ MTd)". Und jetzt funktioniert es. Konnte immer noch herausfinden, was das Problem war. Irgendwelche Vorschläge sind willkommen. – KabCode

Antwort

0

Ich werde hier eine begründete Vermutung nehmen, da ich nichts über Protobuf weiß.

Bevorzugen Sie die target_* Befehle.

Proto-Projekt CMakeLists.txt:

target_include_directories(proto 
    PUBLIC 
    "${Protobuf_INCLUDE_DIRS}") 

, der sagt, alles, was das proto Ziel verwendet werden können, jeder für den Zugriff enthält in „$ {Protobuf_INCLUDE_DIRS}“ sowie proto sich Zugang auch in der Lage Sie.

+0

Leider löst das mein Problem nicht. Es scheint, dass das Hauptprojekt CMakeLists.txt die Variable $ {PROTOBUF_LIBRARY} nicht festlegt. – KabCode

+1

Ich habe Ihren Vorschlag sowie die von Macxx zur Verfügung gestellte Zeile hinzugefügt. Wissen, dass es funktioniert. Danke – KabCode

0

Auf meinem PC wird das Projekt kompiliert, aber nicht verknüpft. Um dieses Problem zu beheben, muss die Bibliothek proto die Bibliothek protobuf verknüpfen. Dies kann durch Hinzufügen der folgende Zeile zu proto/CMakeLists.txt

TARGET_LINK_LIBRARIES(proto ${PROTOBUF_LIBRARY}) 

Nach dieser Änderung geschieht es auf meinem PC funktioniert.

+0

Ich fügte deinen Vorschlag sowie die von utopia zur Verfügung gestellte Linie hinzu. Danke – KabCode

1

In Ihrem CMakeLists.txt sollten Sie PROTOBUF_INCLUDE_DIR mit Protobuf_INCLUDE_DIR oder Protobuf_INCLUDE_DIRS (man beachte die S am Ende) und PROTOBUF_LIBRARY mit Protobuf_LIBRARY oder Protobuf_LIBRARIES ersetzen. Bei CMake-Variablennamen wird zwischen Groß- und Kleinschreibung unterschieden. Ich habe gerade die Version CMake 3.9 überprüft. Das Modul FindProtobuf.cmake, das implizit aufgerufen wird, wenn find_package (Protobuf) verwendet wird, definiert diese Variablen bei erfolgreicher Ausführung.

+0

Toller Punkt. Dies ist auch der Grund, warum ich Kleinbuchstaben standardmäßig überall außer in nicht lokalen Variablen verwende. Uppercase überall macht es auch schwieriger zu lesen. – utopia

Verwandte Themen