2012-01-04 7 views
4

arm-linux-gccコンパイラスイートを使用してARMアーキテクチャ用の簡単なプログラムをクロスコンパイルしたいと考えています[arm-linux-gcc(Buildroot 2011.08) 4.3.6]。私はCコードをコンパイルするためのシンプルなmakefileと、C++コードをコンパイルするためのもう一つのシンプルなmakefileを使用しようとしました。たとえば、Cコード用のmakefileは以下に再現されていますが、組み込みシステムで実行するためのELFバイナリは作成されません。ホストシステムはx64 GNU Linuxです。ここでarm-linux-gccで使用されるC/C++ターゲットのシンプルなメークファイル

は、Cプログラムのための私の非常にシンプルなメイクファイルのリストです:

CC=arm-linux-gcc 
CFLAGS=-Wall 
main: test.o 

clean: 
    rm -f test test.o 

上に再現メイクだけ延長の.oを持つオブジェクトファイルを作成し、ELFバイナリを作成しません。

グーグルでは良い解決策がありましたが、CとC++プログラムの両方でARMのメイクファイルをクロスコンパイルする例を示すWebページが見つからないようです。おそらくこの投稿への答えはそのような例を示すことができます。

答えて

3

私はあなたのMakefileを試してみましたが、次のように変更:

test: test.o 

これを変更し、testと呼ばれるバイナリを作成した後、それが働きました。依存関係の1つがwhatever.oである場合、whateverをリンクする方法を知っている暗黙のルールがあるようです。

もう一つの方法は、明示的にルールをリストアップすることです:

main: test.o 
     $(CC) -o [email protected] $$ 

これは(依存関係を意味する)と$$ターゲットを意味する)特殊なマクロ[email protected]を使用しています。

+0

ありがとう、Greg;これはうまくいく。 –

5

GNU makeマニュアル(info make)、Section 10.2をご覧ください。暗黙的なルールのカタログ、すなわちコマンドを明示的に記述する必要がないルールがあります。 @ GregHewgillと同様に、「単一のオブジェクトファイルをリンクする」暗黙のルールはN.oからNを作成しますが、名前は一致する必要があります。そのため、あなたはどちらか(それがallターゲットを定義しているため、より標準)、その場合

test: 

かであなたのオブジェクトファイルなどの実行可能ファイル、

all : test 

が完全に十分に名前を付けることができます。 Greg Hewgillも説明したように、ルールを明示的に書き出すこともできます。この場合、標準のルールは次のとおりです。

$(CC) $(LDFLAGS) N.o $(LOADLIBES) $(LDLIBS) 

はあなたのMakefileでLDFLAGSとLDLIBSを含め、それがユーザーのために生活が容易になります。

(sic:私はLOADLIBESは本当にLOADLIBSだと思うし、作者は-oを見逃したと思う)。

全体的に、私はautoconfautomakeを手渡しメイクファイルの代わりにお勧めします。非常に少ない作業でMakefileの機能をたくさん提供します。

+0

すばらしいコメントをありがとう、thiton;これは非常に感謝しています。 –

関連する問題