3

今晚我们遇到了一个烦人的问题,它只出现在 Xcode 的命令行构建中,而不是来自 Xcode 的 GUI。

当使用 Xcode 的 GUI 和 $PROJROOT 的递归用户标头搜索路径从机器构建时,没有双引号,我们没有遇到任何问题。但是,当使用 Jenkins 构建时,它使用 Xcode 的命令行构建功能,会引发无法找到标头的错误。

经过一个小时的探索,有人决定尝试将递归 $PROJROOT 用双引号 ("$PROJROOT") 括起来。一旦发生这种情况,项目的 Jenkins 命令行构建终于成功了。

所以我们并不完全理解将搜索路径用引号括起来或省略引号的后果。

任何人都可以阐明究竟是什么导致了这个问题?什么双引号从命令行与 GUI 对编译器意味着什么?

4

2 回答 2

10

您的构建机器上的路径很可能在其中有一个空间(例如“ Macintosh HD/My Project/”)。当从命令行调用工具时,这往往会使事情变得混乱,因为命令行解析器不知道空格字符是路径的一部分,或者它是否从另一个命令行参数开始,所以这就是为什么包装总是好的双引号内的路径。

另一种选择是使用带空格的反斜杠(例如Macintosh\ HD/My\ Project/),但这有点难以跟踪并且更难观察。

于 2013-02-16T02:46:12.083 回答
1

当某些工具通过 shell 执行另一个二进制文件时,可能是 Bash 分词。

几乎没有用的手册页文档:
http ://www.gnu.org/software/bash/manual/html_node/Word-Splitting.html#Word-Splitting

分词详细说明:http:
//mywiki.wooledge.org/WordSplitting

我没有足够的声誉将最后 3 个作为链接发布。

处理文件名时的常见陷阱(此列表中的#1):
mywiki.wooledge.org/BashPitfalls

比较 Posix system()...
stackoverflow.com/questions/5666962/will-posix-system3-call-to-an-asynchronous-shell-command-return-immediately

到 NSTask(它构建一个参数数组,因此没有分词)...
stackoverflow.com/questions/412562/execute-a-terminal-command-from-a-cocoa-app

于 2013-02-16T03:40:16.727 回答