2017-07-20 127 views
1

我嘗試編譯此項目:https://github.com/shaochuan/cmake-protobuf-example。我用msvc2015(x64)成功編譯了protobuf。檢查項目運行時沒有錯誤(所有結果:PASSED)。Protobuf:無法打開message.pb.h文件中的包含文件common.h

我設置在C進行項目,提供所有的路徑:

Protobuf_INCLUDE_DIR = C:/ TK/protobuf的-330/msvc2015_64 /安裝/包括 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/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

原型項目編譯沒有任何錯誤。它包含message.cc和message.h文件。該的CMakeLists.txt看起來是這樣的:

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主要項目:

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發生說法錯誤:

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

在文件中的錯誤行是:

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

我想不通哪裏出了問題。一些提示表示讚賞。有沒有關於cmake + protobuf + visual studio 2015的一些已知問題? 在此先感謝。

+0

感謝Macxx和烏托邦。我將兩個建議的行添加到了proto-project CMakeLists.txt的末尾,並將兩個項目的項目屬性更改爲「多線程調試(/ MTd)」。現在它起作用了。仍然可以找出問題所在。歡迎任何建議。 – KabCode

回答

0

因爲我對protobuf一無所知,所以在這裏我會接受一個有教養的猜測。

優選target_*命令。

原項目的CMakeLists.txt:

target_include_directories(proto 
    PUBLIC 
    "${Protobuf_INCLUDE_DIRS}") 

,說,一切使用proto目標將能夠訪問任何包含「$ {} Protobuf_INCLUDE_DIRS」以及proto本身也能獲得他們。

+0

不幸的是,這並沒有解決我的問題。看來主項目C​​MakeLists.txt不會設置$ {PROTOBUF_LIBRARY}變量。 – KabCode

+1

我加了你的建議以及Macxx提供的一行。知道它的作品。謝謝 – KabCode

0

在我的電腦上,項目正在編譯,但沒有鏈接。所以,要解決這個問題,需要鏈接protobuf庫的庫proto。這可以通過將以下行添加到proto/CMakeLists.txt

TARGET_LINK_LIBRARIES(proto ${PROTOBUF_LIBRARY}) 

在此更改後,它可以在我的PC上運行。

+0

我增加了你的建議,以及烏托邦提供的線。謝謝 – KabCode

1

在你的CMakeLists.txt你應該Protobuf_INCLUDE_DIRProtobuf_INCLUDE_DIRS(注意S末),並用PROTOBUF_LIBRARYProtobuf_LIBRARY更換Protobuf_LIBRARIESPROTOBUF_INCLUDE_DIR。 CMake變量名稱區分大小寫。我剛剛檢查了CMake 3.9版本。當使用find_package(Protobuf)時,隱式調用的FindProtobuf.cmake模塊在成功運行時定義這些變量。

+0

偉大的一點。這也是爲什麼我在默認情況下使用小寫字母,除非是非局部變量。大寫字母也使得閱讀困難。 – utopia

相關問題