当前位置: 首页 > 知识库问答 >
问题:

编译协议缓冲区生成的源文件时,是否有一些更好的方法来解决警告?

方斌
2023-03-14

对于简单的proto文件:

message Person {
  required int32 id = 1;
  required string name = 2;
  optional string email = 3;
}

它是由protoc编译的。exe和结果也用于一个简单的测试项目,该项目基本上什么都不做,只包括protoc生成的文件。

我正在使用msvc10构建测试项目(x64),然后它给了我很多警告:

Warning 1   warning C4244: 'return' : conversion from '__int64' to 'int', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\descriptor.h 1441    1   testProtobuf
...
Warning 11  warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data    D:\Work\protobuf-trunk\src\google\protobuf\unknown_field_set.h  142 1   testProtobuf
Warning 12  warning C4267: 'return' : conversion from 'size_t' to 'int', possible loss of data  D:\Work\protobuf-trunk\src\google\protobuf\unknown_field_set.h  237 1   testProtobuf
...
Warning 14  warning C4244: '=' : conversion from '__int64' to 'int', possible loss of data  D:\Work\protobuf-trunk\src\google\protobuf\io\coded_stream.h    902 1   testProtobuf
Warning 15  warning C4244: 'return' : conversion from '__int64' to 'int', possible loss of data D:\Work\protobuf-trunk\src\google\protobuf\io\coded_stream.h    1078    1   testProtobuf
Warning 16  warning C4267: 'argument' : conversion from 'size_t' to 'google::protobuf::uint32', possible loss of data   D:\Work\protobuf-trunk\src\google\protobuf\wire_format_lite_inl.h   663 1   testProtobuf
...
Warning 19  warning C4267: 'return' : conversion from 'size_t' to 'int', possible loss of data  D:\Work\protobuf-trunk\src\google\protobuf\wire_format_lite_inl.h   739 1   testProtobuf
Warning 20  warning C4267: 'argument' : conversion from 'size_t' to 'google::protobuf::uint32', possible loss of data   D:\Work\protobuf-trunk\src\google\protobuf\wire_format_lite_inl.h   742 1   testProtobuf
Warning 21  warning C4267: 'return' : conversion from 'size_t' to 'int', possible loss of data  D:\Work\protobuf-trunk\src\google\protobuf\wire_format_lite_inl.h   743 1   testProtobuf
Warning 22  warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data    D:\Work\testProtobuf\testProtobuf\person.pb.cc  211 1   testProtobuf
...
Warning 28  warning C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility 2239    1   testProtobuf
Warning 29  warning C4996: 'std::_Copy_impl': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xutility 2239    1   testProtobuf

有什么好的方法来解决所有这些警告吗?任何建议都将不胜感激。

另外,libprotobuf项目本身可以由msvc10干净地编译,而无需任何警告。

[编辑2013/02/20]

工作解决方案:

  1. 为生成的protoc设置属性。cc文件:配置属性-

共有3个答案

万德海
2023-03-14
匿名用户

由于维护工作量大,我不太喜欢破解protoc源代码,所以我想出了更简单的解决方案。

您可能已经在使用某种脚本生成文件,因为您需要将许多参数传递给原型,因此进一步自定义此脚本非常容易。

我创建了powershell脚本,该脚本对生成的文件进行后期处理,并在生成的文件的开头添加include“Grpc.Header.h”,在所述文件的结尾添加include“Grpc.Footer.h”。然后,可以在将这些头文件放置到项目中时自定义这些头文件。除了使用pragma warning禁用警告之外,我还可以在需要时轻松引入其他更改。

注意:在这个示例中,我生成了我的项目所需的其他定义,以及对MSVC很好的预编译头支持。我将这个留在示例中,以说明您可以做什么,但可以安全地删除它<代码>dllexport\u decl=MYAPI允许导出dll项目中的protobuf类。

GenerateProto。ps1:

$ProjectDirectory = "My\Project\Directory\"
$ProtoDirectory = "My\Proto\Directory"

protoc --proto_path=$ProtoDirectory --cpp_out=dllexport_decl=MYAPI:$ProjectDirectory universe.proto

$Plugin = where.exe grpc_cpp_plugin

protoc --proto_path=$ProtoDirectory --grpc_out=$ProjectDirectory --plugin=protoc-gen-grpc=$Plugin universe.proto

foreach($File in Get-ChildItem $ProjectDirectory* -Include *.pb.cc, *.pb.h )
{
    $Content = Get-Content $File

    if( $File.FullName.EndsWith(".cc"))
    {
        Set-Content $File "#include `"pch.h`""
        Add-Content $File "#include `"Grpc.Header.h`""
    }
    else
    {
        Set-Content $File "#include `"Grpc.Header.h`""
    }

    Add-Content $File $Content
    Add-Content $File "#include `"Grpc.Footer.h`""
}

Grpc. Header. h:

#pragma warning(push)
#pragma warning(disable: 4251)

#ifdef API_EXPORT
#  define MYAPI __declspec(dllexport)
#else
#  define MYAPI __declspec(dllimport)
#endif

Grpc。页脚。h:

#pragma warning(pop)

印辉
2023-03-14

您可以破解协议编译器的源代码,让它自动将实用程序注入生成的文件中。

在src/google/frobuf/compiler/cpp/cpp_file.cc在GenerateHeader(io::打印机*打印机)第94行左右,更改第一个打印机-

  // Generate top of header.
  printer->Print(
    "// Generated by the protocol buffer compiler.  DO NOT EDIT!\n"
    "// source: $filename$\n"
    "\n"
    "#ifndef PROTOBUF_$filename_identifier$__INCLUDED\n"
    "#define PROTOBUF_$filename_identifier$__INCLUDED\n"
    "\n"
    "#ifdef _MSC_VER\n"
    "#  pragma warning(push)\n"
    "#  pragma warning(disable: 4127 4244 4267)\n"
    "#endif\n"
    "\n"
    "#include <string>\n"
    "\n",
    "filename", file_->name(),
    "filename_identifier", filename_identifier);

然后在第294行附近的相同功能结束时,更改最后一台打印机-

  printer->Print(
    "#ifdef _MSC_VER\n"
    "#  pragma warning(pop)\n"
    "#endif\n"
    "\n"
    "#endif  // PROTOBUF_$filename_identifier$__INCLUDED\n",
    "filename_identifier", filename_identifier);

现在您只需要编译protoc目标并运行新的protoc。exe在生成的标头中包含pragmas。

倪鹏
2023-03-14

一种简单的方法是使用包装标头来包含生成的原型标头:

#ifndef MESSAGES_WRAPPER_H
#define MESSAGES_WRAPPER_H

#ifdef _MSC_VER
  #pragma warning(push)
  #pragma warning(disable: 4018 4100 4267)
#endif

#include "messages.pb.h"

#ifdef _MSC_VER
  #pragma warning(pop)
#endif

#endif // MESSAGES_WRAPPER_H
 类似资料:
  • 问题内容: 我的一位同事提出了在运行时生成协议缓冲区类的想法。含义: 有C ++服务器应用程序和Java客户端应用程序通过TCP / IP通过协议缓冲区消息进行通信。 C ++应用程序在不同版本中可能具有不同的架构,并且不一定向后兼容 有与此服务器通信的Java应用程序,该应用程序应支持所有可能的服务器版本。 这个想法是服务器将协议缓冲区的定义作为初始握手的一部分发送,并且Java应用程序在运行时

  • 我正在学习关于协议缓冲区的google python教程,在编译器出现之前,我已经能够成功地完成所有工作。 https://developers.google.com/protocol-buffers/docs/pythontutorial 本教程内容如下: 现在运行编译器,指定源目录(应用程序的源代码所在的目录–如果不提供值,则使用当前目录)、目标目录(希望生成的代码所在的目录;通常与$SRC\

  • 我正在研究使用协议缓冲区与我们拥有的一些自定义设备进行通信。问题是这些设备运行嵌入式python解释器,我们无法在它们上安装额外的库。有没有办法将. proto文件编译成python而不需要原型库?

  • 我按照协议缓冲区的教程,我在编译时不断遇到不同的错误。我的addressbook.proto文件在中

  • 问题内容: 我grep其他主题,但他们没有帮助我=(。在我的工作服务器上,我没有sudo特权,因此我使用 ./configure –prefix = / home /用户名/本地 然后,我用“ person”示例创建源文件,并使用protoc成功地对其进行编译。 我没有pkg-info =(。我尝试用 g ++ -I / home /用户名/本地/ include -L / home /用户名/本

  • 我搜索其他主题,但它们对我没有帮助=(。在我的工作服务器上,我没有sudo特权,所以我安装PB时使用 ./配置--prefix=/home/用户名/本地 然后我用“人”例子创建源文件,并用协议成功编译。 我没有pkg信息=(。我尝试用 g-I/home/username/local/include-L/home/username/local/lib-lprotobuf-lpthread main。