dut*_*utt 16 c++ cmake protocol-buffers
我正在尝试使用cmake来使用协议缓冲区构建我的小项目.
有一个根目录,其中包含许多子目录,其中包含许多库和可执行文件.我的第一个想法是将我的.proto文件放在一个子目录中,但是当我读到这个答案时,我用它创建了一个库.但是当我尝试在我的可执行文件中包含一个消息头时,它无法找到它.
错误信息:
fatal error: msgs.pb.h: No such file or directory
#include "msgs.pb.h"
^
compilation terminated.
Run Code Online (Sandbox Code Playgroud)
我通过创建一个目录"build"然后从它里面"cmake .. && make"来运行它.我看了,似乎生成的文件放在构建/消息中,所以我可以做include_directories(构建/消息),但这似乎不正确.使用protobuf有没有正确的方法?我希望将消息文件放在自己的文件夹中的原因是它们将被用于许多不同的小型可执行文件中.
任何其他改进我的CMake结构的一般技巧也值得赞赏:)
目录:
root
messages
core
server
Run Code Online (Sandbox Code Playgroud)
根/的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()
Run Code Online (Sandbox Code Playgroud)
消息/的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})
Run Code Online (Sandbox Code Playgroud)
核心/的CMakeLists.txt:
aux_source_directory(src SRC_LIST)
add_library(core STATIC ${SRC_LIST})
target_link_libraries(core messages ${Boost_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
服务器/的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})
Run Code Online (Sandbox Code Playgroud)
服务器/ main.cpp中:
#include "msgs.pb.h"
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Fra*_*ser 22
我认为这里的问题是该PROTOBUF_GENERATE_CPP函数将.pb.h和.pb.cc文件设置为存在于构建树中,而不是源树中.
这是一种很好的做法(不会污染源树),但这意味着您的调用include_directories(../messages)正在向搜索路径添加错误的值.这是添加源目录"root/messages",而你想要"[build root]/messages".
您可能只需用以下内容替换该行:
include_directories(${CMAKE_BINARY_DIR}/messages)
Run Code Online (Sandbox Code Playgroud)
但是,更健壮,可维护的方法可能是在messages/CMakeLists.txt中设置所需的包含路径.要将此值公开给父作用域,需要使用set(... PARENT_SCOPE)或:
set(ProtobufIncludePath ${CMAKE_CURRENT_BINARY_DIR}
CACHE INTERNAL "Path to generated protobuf files.")
Run Code Online (Sandbox Code Playgroud)
然后在顶级CMakeLists.txt中,您可以执行以下操作:
include_directories(${ProtobufIncludePath})
Run Code Online (Sandbox Code Playgroud)
如果您的messages库本身需要#include生成的protobuf文件(这是正常的),那么它也应该有类似的include_directories调用.
说了这么多,如果你可以指定CMake v2.8.12作为最小值,你可以改用target_include_directories命令.
在add_library通话后的Messages/CMakeLists.txt中,您只需执行以下操作:
target_include_directories(messages PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
Run Code Online (Sandbox Code Playgroud)
然后任何其他依赖messages自动的目标都有适当的"消息",包括添加到自己的目录 - 你根本不需要明确调用include_directories.
| 归档时间: |
|
| 查看次数: |
24664 次 |
| 最近记录: |