objcopy在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才能使其正常工作。但是这个技巧在生成文件上不起作用。它也发生在gccld上,但是当我在 makefile 中重新键入命令时,它们最终都起作用了,但没有objcopy.这里有什么问题?

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

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

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

这对我来说几乎是钉子。 您的生成文件很可能包含 Ubuntu 无法识别为空格的非打印字符。 至少有一个这样的字符紧邻每个命令名称,可能紧挨着它,命令名称被解释为包含该字符。 此外,您可以将其与命令一起剪切和粘贴,但当然,如果您只是在makefile中键入似乎是命令的内容,则它不存在。

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

您可以通过使用tr命令处理 makefile 来过滤生成文件中的所有此类字符:

tr -cd 'tn40-176' < Makefile > Makefile.new

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

最新更新