Windows 中的协议错误

Protoc error in Windows

我正在尝试使用 maven protoc plugin 和我在 Cygwin 中构建的 protoc 可执行文件来编译协议缓冲区代码。我无法从 Cygwin 或 Windows 命令行执行此操作。下面是我在 Windows 中 运行 时得到的输出,但是当从 Cygwin 运行ning 时错误是相同的。我觉得这很奇怪,因为如果问题出在路径转换上,那么我希望其中一个能起作用。可执行文件是用 Cygwin 的 g++ 构建的这一事实可能会影响事情吗? (显而易见,有问题的目录确实存在。)

编辑:当我从图片中删除 maven 并手动调用 protoc 时,我得到了同样的错误。

编辑 2:我可以通过使用相对或绝对路径从 Cygwin 手动调用 protoc 来解决这个问题(但波浪号扩展不起作用)。使用相对或绝对路径从 Windows 手动调用协议继续给出相同的错误。

[DEBUG]   (f) outputDirectory = c:\cygwin64\home\dan\code\server\protocol\target\generated-sources\protobuf\java
[DEBUG]   (f) project = MavenProject: server:protocol:1.0-SNAPSHOT @ c:\cygwin64\home\dan\code\server\protocol\pom.xml
[DEBUG]   (f) protoSourceRoot = c:\cygwin64\home\dan\code\server\protocol\src\main\proto
[DEBUG]   (f) protocPluginDirectory = c:\cygwin64\home\dan\code\server\protocol\target\protoc-plugins
[DEBUG]   (f) remoteRepositories = [
      id: central
      url: https://repo.maven.apache.org/maven2
      layout: default snapshots: [enabled => false, update => daily]
      releases: [enabled => true, update => daily]
      ]
[DEBUG]   (f) session = org.apache.maven.execution.MavenSession@24fb6a80
[DEBUG]   (f) skip = false
[DEBUG]   (f) staleMillis = 0
[DEBUG]   (f) temporaryProtoFileDirectory = c:\cygwin64\home\dan\code\server\protocol\target\protoc-dependencies
[DEBUG]   (f) writeDescriptorSet = false
[DEBUG] -- end configuration --
[WARNING] No 'protocExecutable' parameter is configured, using the default: 'protoc'
[DEBUG] Proto source root:
[DEBUG]  c:\cygwin64\home\dan\code\server\protocol\src\main\proto
[DEBUG] [PROTOC] Executable:
[DEBUG] [PROTOC]  protoc
[DEBUG] [PROTOC] Protobuf import paths:
[DEBUG] [PROTOC]  c:\cygwin64\home\dan\code\server\protocol\src\main\proto [DEBUG] [PROTOC] Java output directory:
[DEBUG] [PROTOC]  c:\cygwin64\home\dan\code\server\protocol\target\generated-sources\protobuf\java
[DEBUG] [PROTOC] Protobuf descriptors:
[DEBUG] [PROTOC]  c:\cygwin64\home\dan\code\server\protocol\src\main\proto\message.proto
[DEBUG] [PROTOC] Command line options:
[DEBUG] [PROTOC]
    --proto_path=c:\cygwin64\home\dan\code\server\protocol\src\main\proto
    --java_out=c:\cygwin64\home\dan\code\server\protocol\target\generated-sources\protobuf\java
    c:\cygwin64\home\dan\code\server\protocol\src\main\proto\message.proto
[INFO] Compiling 1 proto file(s) to c:\cygwin64\home\dan\code\server\protocol\target\generated-sources\protobuf\java
[ERROR] PROTOC FAILED: c: warning: directory does not exist. c:\cygwin64\home\dan\code\server\protocol\src\main\proto\message.proto: File does not reside within any path specified using --proto_path (or -I).  You must specify a --proto_path which encompasses this file. Note that the proto_path must be an exact prefix of the .proto file names -- protoc is too dumb to figure out when two paths (e.g. absolute and relative) are equivalent (it's harder than you think).

您使用 Cygwin 构建的可执行文件将依赖于完整的 Cygwin 环境,并且无论您如何执行它们,都将像 Cygwin 程序一样运行。也就是说,如果您从非 Cygwin shell 执行 Cygwin 程序,它仍然会像 Cygwin 程序一样运行。 Cygwin 程序不接受使用反斜杠和驱动器号的 Windows 风格的路径;你需要使用例如/cygdrive/c/ 而不是 c:\.

一般来说,您不应尝试从非 Cygwin shell 使用 Cygwin 编译的命令行工具。相反,请尝试使用 MSVC 或 MinGW 构建 protoc,或使用 Google 提供的预构建 Windows 二进制文件。