我正在尝试使用cmake来使用protocol buffer构建我的小项目。
有一个根目录,其中包含许多子目录,其中包含许多库和可执行文件。我的第一个想法是把我的.proto文件放在一个子目录中,但是当我读到this answer的时候,我用它做了一个库。但是当我试图在我的可执行文件中包含一个消息头时,它找不到它。
错误消息:
fatal error: msgs.pb.h: No such file or directory
#include "msgs.pb.h"
^
compilation terminated.我通过在其中创建一个dir "build“,然后"cmake .. && make”来运行它。我已经看过了,似乎生成的文件被放到了seem...proper /messages中,所以我可以做构建( build/messages ),但那不是build。有没有合适的方式用protobuf来做这件事?我希望将消息文件放在自己的文件夹中的原因是,它们将在许多不同的小可执行文件中使用。
对于改进我的CMake结构的任何其他一般技巧也是非常感谢的:)
目录:
root
messages
core
serverroot/CMakeLists.txt:
project(lillebror)
cmake_minimum_required(VERSION 2.8)
cmake_policy(SET CMP0015 NEW)
set(Boost_USE_STATIC_LIBS ON)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)
find_package(Boost COMPONENTS date_time log thread system)
find_package(Protobuf REQUIRED)
if(Boost_FOUND)
add_definitions(-std=c++11)
add_subdirectory(messages)
add_subdirectory(core)
add_subdirectory(server)
add_subdirectory(testserver)
endif()messages/CMakeLists.txt:
file(GLOB ProtoFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.proto")
PROTOBUF_GENERATE_CPP(ProtoSources ProtoHeaders ${ProtoFiles})
add_library(messages STATIC ${ProtoSources} ${ProtoHeaders})
target_link_libraries(messages ${Boost_LIBRARIES} ${PROTOBUF_LIBRARY})core/CMakeLists.txt:
aux_source_directory(src SRC_LIST)
add_library(core STATIC ${SRC_LIST})
target_link_libraries(core messages ${Boost_LIBRARIES})服务器/CMakeLists.txt:
aux_source_directory(src SRC_LIST)
include_directories(../messages) <---- I thought this would sove my problem
include_directories(../core/src)
link_directories(../core/build)
add_executable(server ${SRC_LIST})
target_link_libraries(server core ${Boost_LIBRARIES})server/main.cpp:
#include "msgs.pb.h"
int main()
{
return 0;
}发布于 2013-12-29 20:19:04
我认为这里的问题是PROTOBUF_GENERATE_CPP函数将.pb.h和.pb.cc文件设置为存在于构建树中,而不是源代码树中。
这是一个很好的实践(不会污染源代码树),但这意味着您的调用include_directories(../messages)向搜索路径添加了错误的值。这是添加源目录" root/messages“,而您想要的是"build root/messages”。
您可能只需将该行替换为:
include_directories(${CMAKE_BINARY_DIR}/messages)但是,更健壮、更可维护的方法可能是在message/CMakeLists.txt中设置所需的包含路径。要将此值公开给父作用域,需要使用set(... PARENT_SCOPE)或:
set(ProtobufIncludePath ${CMAKE_CURRENT_BINARY_DIR}
CACHE INTERNAL "Path to generated protobuf files.")然后,在顶级CMakeLists.txt中,您可以执行以下操作:
include_directories(${ProtobufIncludePath})如果您的messages库本身需要#包含生成的protobuf文件(这是正常的),那么它也应该有一个类似的include_directories调用。
话虽如此,如果您可以将CMake v2.8.12指定为最低版本,则可以使用target_include_directories命令。
在add_library调用之后的messages/CMakeLists.txt中,您只需执行以下操作:
target_include_directories(messages PUBLIC ${CMAKE_CURRENT_BINARY_DIR})然后,任何其他依赖于messages的目标都会自动将适当的“消息”包括目录添加到它自己的目录中-您根本不需要显式地调用include_directories。
https://stackoverflow.com/questions/20824194
复制相似问题