cmake_minimum_required(VERSION 3.10) project(devGrpcClient VERSION 1.0.0 LANGUAGES CXX) # 设置编译选项 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_compile_options(-fPIC -g -Wall -march=armv8-a) # 目标目录 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) get_filename_component(DELIVER_DIR "${CMAKE_BINARY_DIR}/../../Deliver" ABSOLUTE) file(MAKE_DIRECTORY "${DELIVER_DIR}/lib" "${DELIVER_DIR}/include") # ========== 静态依赖 gRPC 1.30.2 相关库 ========== # 1. 库路径(指定编译的静态库) set(GRPC_ROOT "/usr/local/grpc-1.30.2") set(ABSEIL_ROOT "/usr/local/abseil-20210324.2") # 2. 头文件目录 include_directories( ${GRPC_ROOT}/include # gRPC头文件 ${ABSEIL_ROOT}/include # Abseil头文件 ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR} ) # 3. 库文件目录 link_directories( ${GRPC_ROOT}/lib # gRPC库文件 ${ABSEIL_ROOT}/lib # Abseil库文件 ) # 4. gRPC静态库列表(.a文件) set(GRPC_STATIC_LIBS grpc++_reflection grpc++ grpc gpr address_sorting ) # 5. Abseil静态库列表(.a文件) set(ABSEIL_STATIC_LIBS absl_base absl_strings absl_synchronization absl_time absl_bad_optional_access absl_str_format_internal absl_int128 absl_raw_logging_internal absl_spinlock_wait absl_throw_delegate absl_malloc_internal ) # ========== gRPC代码生成器(1.30.2版本的编译器) ========== set(_GRPC_CPP_PLUGIN_EXECUTABLE "${GRPC_ROOT}/bin/grpc_cpp_plugin") if(NOT EXISTS "${_GRPC_CPP_PLUGIN_EXECUTABLE}") message(FATAL_ERROR "未找到gRPC 1.30.2编译器: ${_GRPC_CPP_PLUGIN_EXECUTABLE}") else() message(STATUS "找到gRPC 1.30.2编译器: ${_GRPC_CPP_PLUGIN_EXECUTABLE}") endif() # ========== Protobuf配置(系统静态库) ========== find_package(Protobuf REQUIRED) message(STATUS "使用系统Protobuf版本: ${Protobuf_VERSION}") # ========== 编译Proto文件(与1.30.2版本保持兼容) ========== get_filename_component(DEV_PROTO "${CMAKE_CURRENT_SOURCE_DIR}/protos/device-sm.proto" ABSOLUTE) get_filename_component(DEV_PROTO_DIR "${DEV_PROTO}" PATH) set(DEV_PROTO_SRC "${CMAKE_CURRENT_BINARY_DIR}/device-sm.pb.cc") set(DEV_PROTO_HDR "${CMAKE_CURRENT_BINARY_DIR}/device-sm.pb.h") set(DEV_GRPC_SRC "${CMAKE_CURRENT_BINARY_DIR}/device-sm.grpc.pb.cc") set(DEV_GRPC_HDR "${CMAKE_CURRENT_BINARY_DIR}/device-sm.grpc.pb.h") add_custom_command( OUTPUT "${DEV_PROTO_SRC}" "${DEV_PROTO_HDR}" "${DEV_GRPC_SRC}" "${DEV_GRPC_HDR}" COMMAND $ ARGS --grpc_out="${CMAKE_CURRENT_BINARY_DIR}" --cpp_out="${CMAKE_CURRENT_BINARY_DIR}" -I "${DEV_PROTO_DIR}" --plugin=protoc-gen-grpc="${_GRPC_CPP_PLUGIN_EXECUTABLE}" "${DEV_PROTO}" DEPENDS "${DEV_PROTO}" COMMENT "生成基于gRPC 1.30.2的proto代码" ) add_custom_target(GenerateProto ALL DEPENDS "${DEV_PROTO_SRC}" "${DEV_PROTO_HDR}" "${DEV_GRPC_SRC}" "${DEV_GRPC_HDR}" ) # ========== 编译动态库(依赖静态gRPC和Abseil) ========== set(SRC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/devGrpcClient.cpp ${DEV_PROTO_SRC} ${DEV_GRPC_SRC} ) add_library(devGrpcClient SHARED ${SRC_FILES}) add_dependencies(devGrpcClient GenerateProto) set_target_properties(devGrpcClient PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION 1 OUTPUT_NAME "devGrpcClient" ) # 链接依赖库(静态库+系统库) target_link_libraries(devGrpcClient PRIVATE ${GRPC_STATIC_LIBS} ${ABSEIL_STATIC_LIBS} protobuf::libprotobuf # 系统Protobuf静态库 pthread dl z ssl crypto # 系统基础库 ) # ========== 输出到交付目录 ========== add_custom_command(TARGET devGrpcClient POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "$" "${DELIVER_DIR}/lib/" COMMAND ${CMAKE_COMMAND} -E create_symlink "$" "${DELIVER_DIR}/lib/$" COMMAND ${CMAKE_COMMAND} -E create_symlink "$" "${DELIVER_DIR}/lib/$" COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/src/devGrpcClient.h" "${DELIVER_DIR}/include/" )