0

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

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

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

[调试] (f) outputDirectory = c:\cygwin64\home\dan\code\server\protocol\target\generated-sources\protobuf\java
[调试] (f) 项目 = MavenProject: server:protocol:1.0-SNAPSHOT @ c:\cygwin64\home\dan\code\server\protocol\pom.xml
[调试] (f) protoSourceRoot = c:\cygwin64\home\dan\code\server\protocol\src\main\proto
[调试] (f) protocPluginDirectory = c:\cygwin64\home\dan\code\server\protocol\target\protoc-plugins
[调试] (f) 远程存储库 = [
      编号:中央
      网址:https://repo.maven.apache.org/maven2
      布局:默认快照:[启用 => false,更新 => 每日]
      发布:[启用 => true,更新 => 每日]
      ]
[调试] (f) 会话 = org.apache.maven.execution.MavenSession@24fb6a80
[调试] (f) 跳过 = 假
[调试] (f) staleMillis = 0
[调试] (f)temporaryProtoFileDirectory = c:\cygwin64\home\dan\code\server\protocol\target\protoc-dependencies
[调试] (f) writeDescriptorSet = false
[DEBUG] -- 结束配置 --
[警告] 没有配置 'protocExecutable' 参数,使用默认值:'protoc'
[调试] 原始源根目录:
[调试] c:\cygwin64\home\dan\code\server\protocol\src\main\proto
[调试] [协议] 可执行文件:
[调试] [协议] 协议
[DEBUG] [PROTOC] Protobuf 导入路径:
[DEBUG] [PROTOC] c:\cygwin64\home\dan\code\server\protocol\src\main\proto [DEBUG] [PROTOC] Java 输出目录:
[调试] [协议] c:\cygwin64\home\dan\code\server\protocol\target\generated-sources\protobuf\java
[DEBUG] [PROTOC] Protobuf 描述符:
[调试] [协议] c:\cygwin64\home\dan\code\server\protocol\src\main\proto\message.proto
[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] 将 1 个 proto 文件编译到 c:\cygwin64\home\dan\code\server\protocol\target\generated-sources\protobuf\java
[错误] 协议失败:c:警告:目录不存在。c:\cygwin64\home\dan\code\server\protocol\src\main\proto\message.proto:文件不在使用--proto_path(或-I)指定的任何路径中。您必须指定包含此文件的 --proto_path。请注意,proto_path 必须是 .proto 文件名的精确前缀—— protoc 太笨了,无法确定两个路径(例如绝对路径和相对路径)何时相等(这比您想象的要难)。
4

1 回答 1

2

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

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

于 2015-06-22T04:06:49.497 回答