Makefileクイックスタート(実際のエンジニアリングを例に)
7341 ワード
一、紹介:
GCCを使用して単一のファイルをコンパイルするのは便利ですが、エンジニアリングファイルが多い場合は、コンパイル手順を簡素化し、効率を向上させるスクリプトツールが必要です.Makefileはこのような問題を解決するのにちょうどいいです.
二、本題に入る:
1、Makefile形式 Target:ターゲット と呼ぶ Depends:依存 と呼ぶ cmmand:実行するコマンド(注意:コマンドの前にTABキーが必要)
2、Makefileを簡単に使う$@:ターゲット を表す $
$^:すべての依存を表す %.o:すべてを表す.oファイル、ここで%はワイルドカード です. rm *.o:すべて削除することを表す.oファイル、ここ*もワイルドカード です objs:定義された変数 です.
端末にmakeコマンドを入力すればいいです.上のファイルをコンパイルすると、実行可能なファイルが生成されます.make cleanを入力するとすべてをクリアできます.oファイル
3、実際工事におけるMakefileの使用
クロスコンパイル、arm-linux-gccを使用$(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関数など が入っています.
GCCを使用して単一のファイルをコンパイルするのは便利ですが、エンジニアリングファイルが多い場合は、コンパイル手順を簡素化し、効率を向上させるスクリプトツールが必要です.Makefileはこのような問題を解決するのにちょうどいいです.
二、本題に入る:
1、Makefile形式
Target:Depends
cmmand
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
端末に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 $@ $<