Chr*_*art 2 c++ string protocol-buffers
当我编译使用 Protobuf 的 C++ 程序,然后strings在二进制文件上运行 linux 命令时,其中一个字符串是生成cc文件的路径,其中包含我的主目录和所有内容。显然,我想从二进制文件中删除我的主目录和其他个人信息。
该路径从何而来以及如何防止它进入编译的二进制文件?
该字符串来自嵌入式 protobuf 描述符,用于执行 protobuf 类型的动态自省。本质上,描述符描述了整个.proto文件。描述符本身以protobuf格式编码;请参阅google/protobuf/descriptor.proto。
现在,描述符通常不应包含您所描述的绝对路径。它确实希望包含“规范”路径——即原始文件相对于源代码根的路径名,或者换句话说,您在import该文件的语句中写入的路径。例如,descriptor.proto自己的规范路径是google/protobuf/descirptor.proto; 要导入它,您可以编写import "google/protobuf/descriptor.proto";.
您的描述符获取完整绝对文件系统路径的原因是因为这是您要传递到的路径protoc,并且您没有传递-I标志来告诉protoc源树的根在哪里。由于protoc无法找出源代码的根目录,因此它会回退到文件系统根目录。
例如,假设您的.proto文件是/home/foo/myproj/src/frobber/baz.proto. 假设src此路径中的目录是您的“源根目录”,这意味着您希望人们写入import "frobber/baz.proto";以导入您的原型文件。在这种情况下,您需要protoc像这样调用:
protoc -I/home/foo/myproj/src /home/foo/myproj/src/frobber/baz.proto
Run Code Online (Sandbox Code Playgroud)
请注意,如果您从目录运行命令myproj,那么您可能根本不应该指定绝对路径:
protoc -Isrc src/frobber/baz.proto
Run Code Online (Sandbox Code Playgroud)
非常重要的是,-I这里的标志是源文件名的文本前缀。protoc很笨,只知道如何比较字符串。例如,它不知道当前目录是什么:
# DOES NOT WORK
cd /home/foo/myproj
protoc -I/home/foo/myproj/src src/frobber/baz.proto
Run Code Online (Sandbox Code Playgroud)
而且它也不能规范化“..”:
# DOES NOT WORK: protoc doesn't collapse "xyz/../".
protoc -Isrc xyz/../src/frobber/baz.proto
Run Code Online (Sandbox Code Playgroud)
然而,如果“..”一致,就可以了,因为同样protoc只关心前缀匹配:
# OK: Prefix is consistent.
protoc -Ixyz/../src xyz/../src/frobber/baz.proto
Run Code Online (Sandbox Code Playgroud)
您可以通过将以下行放入文件中以“精简模式”编译原始文件.proto:
option optimize_for = LITE_RUNTIME;
Run Code Online (Sandbox Code Playgroud)
在此模式下,根本不会包含描述符。此外,您可以链接到 protobuf 运行时库的“lite”版本,该版本比常规版本小得多。但是,许多有用的功能将被禁用。整个反射界面将消失,任何依赖于反射的东西也将消失。例如,TextFormat该DebugString()方法用于将消息转换为文本以进行打印以进行调试的 ,将被删除,因此调试将变得更加困难。
| 归档时间: |
|
| 查看次数: |
1400 次 |
| 最近记录: |