【问题标题】:objcopy failed on makefile but no problem on typing it manually in Terminalobjcopy 在 makefile 上失败,但在终端中手动输入没有问题
【发布时间】:2020-01-29 23:05:34
【问题描述】:

我有这个带有以下命令的 Makefile:

all:
    gcc -MD -fno-builtin -nostdinc -fno-stack-protector -Os -g -m32 -I. -c -o boot0.o boot0.S
    ld -nostdlib -m elf_i386 -N -e start -Ttext 0x7c00 -o boot0.elf boot0.o
    objcopy -S -O binary boot0.elf boot0
    ....

虽然这些命令是预先编写的,我只是复制并粘贴到 makefile 中,而我这样做

make all

在终端,它会返回

make: objcopy: command not found

考虑到我通过 VMBox 运行 Xubuntu,这是不可能的。但后来我发现,如果我手动输入该命令,它将起作用。但是,如果我将命令复制并粘贴到终端中,它将不起作用。即使我确实粘贴了它,我也需要重新输入objcopy 才能使其工作。但是这个技巧不适用于makefile。它也发生在gccld 上,但是当我在makefile 中重新键入命令而不是objcopy 时,它们最终都起作用了。这里有什么问题?

【问题讨论】:

    标签: ubuntu makefile virtual-machine


    【解决方案1】:

    但后来我发现,如果我手动输入该命令,它会 工作。但是如果我将命令复制并粘贴到 终端。即使我确实粘贴了它,我也需要重新输入 objcopy 以便 让它工作。

    如果将命令复制并粘贴到终端窗口中不起作用,但在同一终端窗口中手动(重新)键入命令确实有效,那么您实际上并没有输入相同的命令。

    它也发生在 gcc 和 ld 上,但它们最终都在 我在 makefile 中重新输入了命令,但没有在 objcopy 中输入。

    这对我来说非常有用。您的 makefile 很可能包含 Ubuntu 无法识别为空白的非打印字符。至少有一个这样的字符紧邻每个命令名称,可能就在它之前,命令名称被解释为包括该字符。此外,您可以将其与命令一起剪切和粘贴,但如果您只是在 makefile 中键入看起来是命令的内容,那么它当然不存在。

    有时人们会看到与使用 Windows 行终止符而不是 Unix 行终止符相关的类似问题,但这里的情况似乎并非如此。我推测它可能源于从网页复制 makefile 内容。

    您可以通过使用the tr command 处理它来过滤您的makefile 中的所有此类字符:

    tr -cd '\t\n\040-\176' < Makefile > Makefile.new
    

    从代码 040 到 176 八进制(== 32 - 126 十进制 == 20 - 7e 十六进制)保留制表符、换行符和 ASCII 字符。您可以通过比较原始文件和新文件的大小来判断它是否改变了任何内容。假设新文件更小并且看起来还可以,请继续替换原始文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      相关资源
      最近更新 更多