protobuf cmakelist,msvc utf-8设置

源字符集和执行字符集

源字符集指的是cpp文件中字符串的编码方式

执行字符集指的是exe文件中字符串的编码方式

msvc编译器设置的命令行参数

/source-charset:utf-8 /execution-charset:utf-8

cmake中设置

add_compile_options(" < < <<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>")

add_compile_options(" < < <<CXX_COMPILER_ID:MSVC>:/execution-charset:gbk>")

cpp 复制代码
# 必须在add_library , add_executable 前设置,否则无效
add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/source-charset:utf-8>")

# protoc必须要加上这条!!!!!!!!!!!!!!!
add_definitions(-DPROTOBUF_USE_DLLS)

set(Protobuf_DIR "C:/Program Files/protobuf/lib/cmake/protobuf")
set(Absl_DIR "C:/Program Files/protobuf/lib/cmake/absl")
set(Utf8_DIR "C:/Program Files/protobuf/lib/cmake/utf8_range")

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Protobuf)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core)


# 设置 Protobuf 路径
set(PROTOC_PATH "C:/Program Files/protobuf/bin/protoc.exe")
# 查找 protoc 可执行文件
find_program(PROTOC_EXECUTABLE
    NAMES protoc
    PATHS ${PROTOC_PATH}
)
if(NOT PROTOC_EXECUTABLE)
    message(FATAL_ERROR "protoc not found. Please install it or set PROTOC_PATH.")
endif()
message(STATUS "Using protoc: ${PROTOC_EXECUTABLE}")

# 设置 proto 文件目录
set(PROTOBUF_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/proto")

# 设置生成文件输出目录
set(GENERATED_PROTO_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")

# 确保生成文件目录存在
file(MAKE_DIRECTORY ${GENERATED_PROTO_DIR})

# 设置 proto 文件列表
set(PROTO_FILES
    ${PROTOBUF_SRC_DIR}/addressbook.proto
)

# 为每个 proto 文件生成相应的 C++ 文件
foreach(PROTO_FILE ${PROTO_FILES})
    get_filename_component(PROTO_NAME ${PROTO_FILE} NAME_WE)
    set(GENERATED_SRC "${GENERATED_PROTO_DIR}/${PROTO_NAME}.pb.cc")
    set(GENERATED_HDR "${GENERATED_PROTO_DIR}/${PROTO_NAME}.pb.h")

    add_custom_command(
        OUTPUT ${GENERATED_SRC} ${GENERATED_HDR}
        COMMAND ${PROTOC_EXECUTABLE}
        ARGS --cpp_out=${GENERATED_PROTO_DIR} -I${PROTOBUF_SRC_DIR} ${PROTO_FILE}
        DEPENDS ${PROTO_FILE}
        COMMENT "Generating C++ source files from ${PROTO_FILE}"
        VERBATIM
    )

    list(APPEND GENERATED_SRC_FILES ${GENERATED_SRC})
endforeach()

# 将生成的 C++ 文件添加到构建目标中
add_executable(untitled1 main.cpp ${GENERATED_SRC_FILES})

# 添加生成文件目录到 include 路径
target_include_directories(untitled1 PRIVATE ${GENERATED_PROTO_DIR})

# 添加 Protobuf 头文件目录
target_include_directories(untitled1 PRIVATE "C:/Program Files/protobuf/include")

# 查找 C:\Program Files\protobuf\lib 下的所有 .lib 文件
file(GLOB PROTOBUF_LIBRARIES "C:/Program Files/protobuf/lib/*.lib")

# 打印找到的库文件(可选)
#message(STATUS "Protobuf libraries found: ${PROTOBUF_LIBRARIES}")
target_link_libraries(untitled1 Qt${QT_VERSION_MAJOR}::Core ${PROTOBUF_LIBRARIES})
相关推荐
CHN悠远11 分钟前
debian13 安装钉钉后,钉钉无法运行问题的解决办法
linux·运维·服务器·钉钉·debian13
liu****21 分钟前
11.Linux进程信号(三)
linux·运维·服务器·数据结构·1024程序员节
郝学胜-神的一滴24 分钟前
Linux下,获取子进程退出值和异常终止信号
linux·服务器·开发语言·c++·程序人生
檀越剑指大厂33 分钟前
【Nginx系列】Tengine:基于 Nginx 的高性能 Web 服务器与反向代理服务器
服务器·前端·nginx
fufu03111 小时前
俄罗斯方块
linux·运维·服务器
合作小小程序员小小店2 小时前
web安全开发,在线%服务器日志入侵检测%系统安全开发,基于Python,flaskWeb,正则表达式检测,mysql数据库
服务器·python·安全·web安全·flask·安全威胁分析·安全架构
路由侠内网穿透.3 小时前
本地部署消息代理软件 RabbitMQ 并实现外部访问( Windows 版本 )
linux·运维·服务器·远程工作
wanhengidc4 小时前
海外云手机是指什么
运维·服务器·游戏·智能手机·云计算
孙同学_4 小时前
【Linux篇】System V IPC详解:共享内存、消息队列与信号量
linux·服务器
虚伪的空想家6 小时前
记录次etcd故障,fatal error: bus error
服务器·数据库·k8s·etcd