我的系统是Windows 8.1。我正在使用cygwin 32位版本(首先我设置了64位版本,无法完全卸载,后来设置了32位版本。)我只想使用' make'效用。我所有的文件都是'扩展名为' makefile'。 当我在下面尝试这个(看他们工作,我只使用简单的makefile)
make kernel.o (in shell)
kernel.o : kernel.c
<tab>gcc - ffreestanding -c $< -o $@
它起作用,并编译。
但是下面的这些不起作用。为了测试目的并保持简单,每个源和相应的makefile都在自己的目录中。并且所有make命令都是在源和相应的makefile所在的当前目录中创建的。
cygwin运行配方所需的所有可执行文件(nasm,ld,objcopy,cat)都位于同一目录中(即c:\ cygwin \ bin \)
如果我从shell命令配方,它们会起作用。 我还更改了源文件,看看会发生什么。
我还认为问题可能来自cygwin本身,我将linux ubuntu桌面版本设置到我的机器上。但它们(下面的食谱)也不起作用。(如果我从shell命令食谱,它们也能正常工作。)
make kernel_entry.o (in shell)
make: *** No rule to make target 'kernel_entry.o'.
Rule:
kernel_entry.o : kernel_entry.asm
<tab>nasm $< -o $@ -f coff (coff for windows)
//--------------------------------
make os-image.bin (in shell)
make: *** No rule to make target 'os-image.bin'.
Rule:
os-image.bin: boot.bin kernel.bin
<tab>cat $< > $@
//--------------------------------
make boot.bin
make: *** No rule to make target 'boot.bin'.
Rule :
boot.bin : boot.asm
<tab> nasm $< -f bin -o $@
*recipes with ld and objcopy also does not work.*
提前谢谢你......
这些是我的文件和目录外观:
C:\cygwin\bin --> where gcc.stays
C:\cygwin\bin --> where make.exe stays
C:\cygwin\bin --> where objcopy stays
C:\cygwin\bin --> where nasm.exe stays
C:\cygwin\bin --> where ld stays
C:\cygwin\home\me\OS\boot --> where boot.makefile stays and also boot.asm source code
C:\cygwin\home\me\OS\kernel --> where kern.makefile stays ( working sample ) and also kernel.c source code
这是cygwin shell的外观:
me@Me ~/os/kernel
$ dir
kern.makefile kernel.c kernel_entry.asm
**在我的kern.makefile中,现有规则如下
kernel_entry.o : kernel_entry.asm
nasm $< -o $@ -f coff
和启动目录
me@Me ~/os/boot
$ dir
boot.asm disk_load.asm print_hex.asm print_string_pm.asm
boot.makefile gdt.asm print_string.asm switch_to_pm.asm
**在我的boot.makefile中,现有规则如下
boot.bin : boot.asm
nasm $< -f bin -o $@
答案 0 :(得分:0)
Make看不到你的文件。
从GNU make手册:
如果不存在
-f
选项,make
将按顺序查找makefileGNUmakefile
,makefile
和Makefile
。
从我看到的情况来看,您调用kern.makefile
(没有boot.makefile
选项)时找不到您的文件(make
,-f
)。这使得make
依赖于其内部规则,这些规则不包含任何%.o: %.asm
依赖关系或某些(make
,汇编在.s
结束,汇编与预处理完成在.S
)。
当*.c
和*.S
文件 编译成*.o
个文件时,这会导致血腥混乱,因为{{1 确实有那些内部规则 - 当然,它们固执地拒绝考虑你可能在你的那个makefile中定义的任何编译器选项make
没有实际上读了。 ; - )
所以要么打电话
make
或(这是我的推荐),将make -f kern.makefile kernel.o
重命名为<whatever>.makefile
(这是命名这些内容的规范方式)。