CMake 备忘录

CMAKE 强制忽略警告

将目录当作系统目录,可以忽略目录下头文件产生的警告,在某些情况下有用
include_directories(SYSTEM "xxx/include")

CMAKE 配置 protobuf

Q: protobuf_generate_cpp 是 CMake 的内置函数么?
A:

不是的。protobuf_generate_cpp 不是 CMake 的内置函数,而是由 FindProtobuf.cmake 模块提供的一个函数,用于从 .proto 文件生成 C++ 代码。FindProtobuf.cmake 是 Protobuf 库的 CMake 模块。

使用这个函数时,你需要先找到 Protobuf 库。例如:

find_package(Protobuf REQUIRED)

然后你就可以使用 protobuf_generate_cpp 函数了:

protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS my_proto_file.proto)

这里,PROTO_SRCS 和 PROTO_HDRS 分别是生成的源文件和头文件的变量,my_proto_file.proto 是你要编译的 Protobuf 文件。

注意:在某些版本的 Protobuf 中,可能需要导入 FindProtobuf 模块,如下:

include(FindProtobuf)
find_package(Protobuf REQUIRED)

这样才能使用 protobuf_generate_cpp。总的来说,这取决于你的 Protobuf 版本以及你的项目设置。

Q: protobuf_generate_cpp 生成的protobuf文件编译中会有 -Wsign-compare 警告,如何抑制
A:

如果你在使用 Protobuf 生成的 C++ 文件进行编译时遇到 -Wsign-compare 警告,并且你不希望看到这些警告,可以在你的 CMakeLists.txt 中添加一些设置来抑制这些警告。

一个常见的方法是为 Protobuf 生成的文件单独指定编译选项。例如,你可以关闭 -Wsign-compare 警告:

set_source_files_properties(${PROTO_SRCS} ${PROTO_HDRS}
    PROPERTIES COMPILE_FLAGS "-Wno-sign-compare")

在这个例子中,${PROTO_SRCS} 和 ${PROTO_HDRS} 是由 protobuf_generate_cpp 函数生成的源文件和头文件的变量。-Wno-sign-compare 是 GCC 和 Clang 编译器用来关闭 -Wsign-compare 警告的选项。

然而,请注意,这样做可能会使你忽视其他重要的警告。确保这是你想要的结果,并且理解这可能带来的后果。

Q: 这个语句放在 protobuf_generate_cpp 之前么?
A:

你应该在调用 protobuf_generate_cpp 后,且在添加目标(如: add_executable 或 add_library)前使用 set_source_files_properties。理由是 protobuf_generate_cpp 生成的源文件和头文件需要在 set_source_files_properties 调用时已存在。

所以先后顺序应该如下:

find_package(Protobuf REQUIRED)

# Generate the .cpp and .h files from .proto files
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS my_proto_file.proto)

# Set properties to suppress warnings in protobuf generated files
set_source_files_properties(${PROTO_SRCS} ${PROTO_HDRS}
    PROPERTIES COMPILE_FLAGS "-Wno-sign-compare")

# Then add your target (library or executable)
add_executable(MyExecutable ${SRC_LIST} ${PROTO_SRCS} ${PROTO_HDRS})
posted @ 2023-09-08 18:30  ffl  阅读(46)  评论(0编辑  收藏  举报