4

-m32 フラグを使用して非常に単純なプログラムをコンパイルしようとしています。
gcc -m32 を使用してこれを実行しようとすると、問題なく動作します(必要なライブラリがあります)

それでも、このフラグをメイクファイルのフラグに追加すると、奇妙なエラーが発生します
これは私が持っているメイクファイルです

CC=gcc
CFLAGS=-m32 -O1 -W -Wall -pedantic -std=c99

all: main.o 
    $(CC) -o main main.o 
    rm main.o 

clean: 
    rm main

私が受け取るエラーは次のとおりです

gcc -o main main.o
/usr/bin/ld: i386 architecture of input file `main.o' is incompatible with i386:x86-64 output
collect2: ld returned 1 exit status
make: *** [all] Error 1

誰かがこれが何を意味するのか教えてもらえますか? どうすれば修正できますか?

コードに関しては、コードは「hello world」を出力する以外は何もしません

Linux 2.6.35 64 ビットで GCC 4.4.3 を使用しています

4

2 に答える 2

11

-m32あなたの間違いはあなたがリンカーに渡さないということです。

Makefile実際には、次のように変更する必要があります。

CC=gcc
CFLAGS=-m32 -O1 -W -Wall -pedantic -std=c99
LDFLAGS = -m32

all: main.o 
    $(CC) $(LDFLAGS) -o main main.o 
    rm main.o 

clean: 
    rm main

さらに良いアプローチは次のとおりMakefileです。

CC=gcc
CFLAGS=-m32 -O1 -W -Wall -pedantic -std=c99
LDFLAGS=-m32

.INTERMEDIATE: main.o

all: main

main: main.o

clean: 
    -rm main

後で、mainはに依存しmain.o、 as引数を使用GNU Makeしてリンカーを呼び出すので、LDFLAGSas引数を使用してリンカーを呼び出すと言いますCFLAGSmain.o

「.INTERMEDIATEが依存するターゲットは中間ファイルとして扱われます。「暗黙のルールのチェーン」セクションを参照してください。依存関係のない.INTERMEDIATEは、makefileで言及されているすべてのファイルターゲットを中間としてマークします。」特別な組み込みのターゲット名

于 2012-10-19T20:47:35.823 に答える
5

アーキテクチャが 32 ビットであることもリンカーに通知する必要があります。追加してみる

LD = $(CC)
LDFLAGS = -m32

あなたのMakefileに変更してください

$(CC) -o main main.o

$(LD) $(LDFLAGS) -o main $^

そしてそれはうまくいくはずです。

(なぜうまくいったのでしょうか? GCC を使用してコードを 1 ステップでコンパイルおよびリンクすると、関連するすべてのフラグとオプションがコンパイラだけでなくリンカーにも渡されます。)

于 2012-10-19T20:33:10.073 に答える