参考http://t.csdnimg.cn/vBMdL
交叉编译工具编译的项目不管用!!!因为只能编译,不能运行!
//方法1 官方推荐方法
find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS foo.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS EXPORT_MACRO DLL_EXPORT foo.proto)
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS DESCRIPTORS PROTO_DESCS foo.proto)
protobuf_generate_python(PROTO_PY foo.proto)
add_executable(bar bar.cc ${PROTO_SRCS} ${PROTO_HDRS})
target_link_libraries(bar ${Protobuf_LIBRARIES})
//方法2 可以放置到任意地方 通过自定义命令 模拟命令行
add_subdirectory(modules)
include_directories(SYSTEM "${CMAKE_CURRENT_SOURCE_DIR}/modules")
set(Protobuf_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/modules/protobuf/src")
set(Protobuf_LIBRARY "${CMAKE_BINARY_DIR}/modules/protobuf/libprotobuf.a")
set(PROTOC_EXECUTABLE "${CMAKE_BINARY_DIR}/modules/protobuf/protoc")
find_package(Protobuf 3.21.4 REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
# include_directories(${CMAKE_CURRENT_BINARY_DIR})
message("========================Protobuf check======================")
# 如果找到 Protobuf 库,输出库和包括目录信息
if(Protobuf_FOUND)
message(STATUS "Protobuf version: ${Protobuf_VERSION}")
message(STATUS "Protobuf include path: ${Protobuf_INCLUDE_DIRS}")
message(STATUS "Protobuf libraries: ${Protobuf_LIBRARIES}")
message(STATUS "Protoc complier: ${PROTOBUF_PROTOC_EXECUTABLE}")
message("CMAKE_BINARY_DIR = ${CMAKE_BINARY_DIR}")
message("PROTOC_EXECUTABLE = ${PROTOC_EXECUTABLE}")
else()
message(FATAL_ERROR "Protobuf not found")
endif()
# Proto 文件路径
set(PROTO_FILE "${CMAKE_CURRENT_SOURCE_DIR}/protoMessage/header.proto")
# 输出目录
set(PROTO_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/protoMessage")
# 生成源文件和头文件的路径
set(PROTO_SRCS "${PROTO_OUTPUT_DIR}/header.pb.cc")
set(PROTO_HDRS "${PROTO_OUTPUT_DIR}/header.pb.h")
# 执行 protoc
add_custom_command(
OUTPUT "${PROTO_SRCS}" "${PROTO_HDRS}"
COMMAND ${PROTOC_EXECUTABLE}
ARGS --cpp_out=${PROTO_OUTPUT_DIR} --proto_path=${CMAKE_CURRENT_SOURCE_DIR}/protoMessage ${PROTO_FILE}
DEPENDS ${PROTO_FILE}
COMMENT "Running C++ protocol buffer compiler with ${PROTOC_EXECUTABLE}"
VERBATIM
)