【问题标题】:How do I use 'make' in C in case of a filename which contains a space?如果文件名包含空格,如何在 C 中使用“make”?
【发布时间】:2017-10-25 20:57:07
【问题描述】:

简介:我制作了一个名为temperature 2.c的文件,当我使用终端“制作”该文件时,它返回错误:
@ 987654325@
Terminal output screenshot

这是我在终端窗口中输入的内容。
make temperature\ 2

版本信息:我使用的是 macOS 10.12.5 和 Apple LLVM 版本 8.1.0 (clang-802.0.42)
Xcode 版本8.3.2 (8E2002)

其他信息:我尝试使用 make "temperature 2",因为有人建议它在 Windows 上工作,但在 Mac 上不工作。
我已经在终端窗口中选择了正确的目录,并且能够完美地编译所有其他文件。
Screenshot of the file

我知道我可以简单地用 下划线 替换 space 来解决问题,但我想知道为什么会这样。
终端可以很好地处理名称中包含 空格 的其他目录(使用反斜杠),那么为什么在这种情况下它不能正常工作呢?

提前致谢。

【问题讨论】:

  • 显示 make 文件中的相关行。 IE。做一个minimal reproducible example
  • 从截图看你没有Makefile,那你makeing是什么?
  • make 不是这样工作的。它在过去有效吗?例如,如果将文件重命名为temperature_2.c,然后执行make temperature_2,它是否有效?
  • 啊,没有生成文件。这意味着您依赖于 make 的隐含规则。这意味着它可能适用于某些平台,而不适用于其他平台。

标签: c makefile terminal clang


【解决方案1】:

Make 将命令提供给 shell,shell 将它们作为命令执行。如果你有这样的一行:

.c.o:
    $(CC) $(CFLAGS) -c -o $@ $<

当你尝试做时

make "some thing".o

它会尝试找到一个名为“something.c”的文件并执行

cc  -c -o some thing.o some thing.c

也就是尝试编译成thing.osomething.c这三个文件

但是如果你把规则改成

.c.o:
    $(CC) $(CFLAGS) -c -o "$@" "$<"

它会用这个喂给外壳

cc  -c -o "some thing.o" "some thing.c"

这将产生正确的行为。

生成文件

.c.o:
    $(CC) $(CFLAGS) -c -o "$@" "$<"

示例运行(在 FreeBSD 系统中):

$ make "the problem.o"
cc -O -pipe -c -o "the problem.o" "the problem.c"

【讨论】:

    【解决方案2】:

    Make 带有几个内置规则,但它们不会被设计用于处理文件名中的空格或其他“不寻常”字符,因此您需要编写一个 Makefile 来覆盖它们或更改文件名。

    此规则是您正在使用的规则 - 您必须在目标文件 $@ 和输入文件 $&lt; 周围加上引号。

    %: %.c
            $(CC) $(CFLAGS) -o "$@" "$<"
    

    【讨论】:

    • 谢谢,它解决了我的问题。虽然我添加了另一个使用您部分答案的答案
    • 只引用一句话:您发布的语法仅在 GNU make 中有效,这不是 Mac OSX 中可用的 make(它是从 BSD make 派生的,恐怕)
    • 看你的回答,我其实隐约记得你提到的那个语法。看起来 GNU make 仍然可以识别它:O
    【解决方案3】:

    调用make时,需要有一个Makefile,快速简单的一文件c程序,

    试试

    gcc -o "temperature 2" "temperature 2.c"
    

    clang -o "temperature 2" "temperature 2.c"
    

    你的品牌清楚地告诉你:

    make: *** No rule to make target 'temperature 2'.  Stop.
    

    【讨论】:

    • 我没有尝试使用 gcc 或 clang 然后使用 ./a.out。我只是想使用'make'命令来获得结果
    • 我想在 *NIX 系统上使用 make,你必须有一个 Makefile 来告诉 make 要做什么。见How to write a Makefile to compile a simple C program
    • 我想补充一点,'make' 正在处理所有其他文件。如果我将名称从“温度 2”更改为“温度_2”,它也可以工作
    • "现在对于您的任务,真的不需要 Makefile,因为 make 具有知道如何编译简单程序的内置规则。" - 我在您发布的链接中找到了这个。简单程序不需要生成文件。
    • 需要 Makefile,另见stackoverflow.com/users/4950584/chris-turner 的回答。 make 内部规则不能处理空格。如果您不想使用 Makefile,请删除文件名中的空格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多