除了gcc

时间:2015-08-05 07:38:13

标签: linux gcc makefile cygwin

我的系统是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 $@

1 个答案:

答案 0 :(得分:0)

Make看不到你的文件。

从GNU make手册:

  

如果不存在-f选项,make将按顺序查找makefile GNUmakefilemakefileMakefile

从我看到的情况来看,您调用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 (这是命名这些内容的规范方式)。