Ubuntu 在makefile上objcopy失败,但在终端中手动键入它时没有问题

Ubuntu 在makefile上objcopy失败,但在终端中手动键入它时没有问题,ubuntu,makefile,virtual-machine,Ubuntu,Makefile,Virtual Machine,我使用以下命令创建此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:

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上不起作用。它也发生在
gcc
ld
上,但当我在makefile中重新键入命令时,它们最终都起作用,而不是
objcopy
。这里有什么问题

但后来我发现,如果我手动键入该命令,它将 工作但如果我将命令复制并粘贴到 终点站。即使我粘贴了它,我也需要重新键入objcopy以便 让它发挥作用

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

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

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

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

通过使用以下方法处理makefile,可以从makefile中筛选所有此类字符:

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

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