Makefileクイックスタート(実際のエンジニアリングを例に)

7341 ワード

一、紹介:
GCCを使用して単一のファイルをコンパイルするのは便利ですが、エンジニアリングファイルが多い場合は、コンパイル手順を簡素化し、効率を向上させるスクリプトツールが必要です.Makefileはこのような問題を解決するのにちょうどいいです.
二、本題に入る:
1、Makefile形式
 Target:Depends
 		cmmand
  • Target:ターゲット
  • と呼ぶ
  • Depends:依存
  • と呼ぶ
  • cmmand:実行するコマンド(注意:コマンドの前にTABキーが必要)
  • gcc    :
    1. -c  (  c)     、        ,           gcc -c
    2. -S  (  S)	        ,                 gcc -S
    3. -E  (  E)	         ,                 gcc -E
    4. -o  (  o)	    file2          file1      gcc -o file1 file2
    5. -I  (  I)	                              gcc -I directory
    6. -g  (  g)                                     gcc -g
    

    2、Makefileを簡単に使う
    objs = main.o init.o start.o
    	gcc -c -o $@ $^
    %.o:%.c
    	gcc -c -o $@ $<   
    %.o:%.S
    	gcc -c -o $@ $<
    clean:
    	rm *.o
    
    
  • $@:ターゲット
  • を表す
  • $
  • $^:すべての依存を表す
  • %.o:すべてを表す.oファイル、ここで%はワイルドカード
  • です.
  • rm *.o:すべて削除することを表す.oファイル、ここ*もワイルドカード
  • です
  • objs:定義された変数
  • です.
    端末にmakeコマンドを入力すればいいです.上のファイルをコンパイルすると、実行可能なファイルが生成されます.make cleanを入力するとすべてをクリアできます.oファイル
    3、実際工事におけるMakefileの使用
    クロスコンパイル、arm-linux-gccを使用
    objs = start.o main.o init.o
    objs += lcd/font.o
    objs += lcd/framebuffer.o
    objs += lcd/geometry.o
    all: $(objs)
    	arm-linux-ld -T out.lds $^ -o out.elf
    	arm-linux-objcopy -O binary -S out.elf out.bin
    	arm-linux-objdump -D out.elf > out.dis
    clean:
    	rm *.bin *.o *.elf *.dis
    	
    %.o : %.c
    	arm-linux-gcc -march=armv4 -c -o $@ $<
    
    %.o : %.S
    	arm-linux-gcc -march=armv4 -c -o $@ $<
    
  • $(objs):変数objsへの参照
  • を表す
  • objs += lcd/font.o:最初のobjsターゲットの下にlcdディレクトリの下のfontを追加することを示す.oファイル、ここで+=は増加の意味を表します.
  • arm-linux-ld -T out.lds $^ -o out.elf :
  • arm-linux-ld:リンク
  • を表す
  • -T:コードセグメント、データセグメント、bss端を示す、ここではoutを用いる.ldsリンクスクリプトは、これらのセグメントが位置する場所を特定します.
  • -o(小文字o:output):前(out.lds、$^)のファイルを用いてout.elfファイル(.elfは実行可能ファイルlinux)を出力します.

  • arm-linux-objcopy -O binary -S out.elf out.bin:ソースファイルを介してout.Elfはバイナリファイルoutを得る.bin
  • arm-linux-objcopy:ターゲットファイルの内容を別のファイル
  • にコピー
  • -O binary(大文字O):指定したフォーマットでファイルを出力します.ここではバイナリ
  • として指定します.
  • -S(大文字S):元のファイルから再配置情報と記号をコピーせずにターゲットファイルに
  • を削除する.
  • out.bin:バイナリファイルで、本で実行されているファイルを開発します.つまり、私たちが得たい
  • です.
  • arm-linux-objdump -D out.elf > out.dis:ソースファイルを介してout.Elfは逆アセンブリファイルoutを得る.dis
  • arm-linux-objdump:逆アセンブリファイル
  • を得る
  • -D:すべてのセグメント(コードセグメント、データセグメント、bssセグメント)を逆アセンブリ
  • arm-linux-gcc-march=armv 4-c-o$<:中-march=armv 4はarmv 4命令でコンパイルする
  • を表す
  • %.S(大文字S):start.Sファイル、cpu起動後に最初に実行されるファイルで、異常ベクトルテーブル、コード再配置、main関数など
  • が入っています.