1

重複の可能性:
glibに対してコンパイルするときのリンカーエラー…?

さて、これは重複している可能性があることは知っていますが、私の問題に対する他の答えは見つかりません。Pintosをインストールしようとしていますが、src/utilsディレクトリで「make」を実行すると「floor」への未定義の参照があるというエラーが表示されます。makefileを確認したところ、次のようになりました。

all: setitimer-helper squish-pty squish-unix
# 2207718881418

CC = gcc
CFLAGS = -Wall -W
LDFLAGS = -lm
setitimer-helper: setitimer-helper.o
squish-pty: squish-pty.o
squish-unix: squish-unix.o

clean: 
    rm -f *.o setitimer-helper squish-pty squish-unix

LIBS = -lmを追加しようとしましたが、役に立ちませんでした。

makeの出力:

gcc -lm  setitimer-helper.o   -o setitimer-helper
setitimer-helper.o: In function `main':
setitimer-helper.c:(.text+0xbb): undefined reference to `floor'
collect2: ld returned 1 exit status
make: *** [setitimer-helper] Error 1

このジレンマに対する解決策はありますか?

4

2 に答える 2

6

元のmakefileは、一連の変数を定義します

CC = gcc
# etc

いくつかの依存関係を一覧表示します

setitimer-helper: setitimer-helper.o
# etc

cleanただし、ルールを除いて、ターゲットを再作成するために使用される正確なコマンドを提供するレシピはありません。これは、組み込みの暗黙のルールが使用されることを意味します。setitimer-helperたとえば、次の組み込みルールをリンクするために使用されます。

$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

の場合setitemer-helper、自動変数は関連する依存関係を使用して入力されます。

$(CC) $(LDFLAGS) setitimer-helper.o $(LDLIBS) -o setitimer-helper

$(CC)これから、残りの変数( 、、、$(LDFLAGS)および)がどのよう$(LDLIBS)に入力されて、見たmakeの出力が得られるかを確認できます。

さまざまな人が指摘しているように、linkコマンド-lm最後にあることを確認して、のようなライブラリ関数への参照を満たすために使用できるようにする必要がありfloor()ます。現時点では、makefileはに設定$(LDFLAGS)され-lmていますが、その変数はリンクコマンドの開始時に使用されます。

従来の変数は、この組み込みルールで設定されているためLDFLAGS、(歴史的に)リンクコマンドの開始時に必要なオプション(別名「フラグ」)LDLIBSに使用でき、必要なライブラリに使用できます。*.oオブジェクトファイルの後に指定されます。

したがって、使用しているmakefileに関してこれを修正するには、定義されている変数から削除-lmし、LDFLAGS代わりに次の変数定義を追加する必要がありLDLIBSます。

LDLIBS = -lm

(少し要約しておきますが、組み込みのルールにはとも含まれていますが$(TARGET_ARCH)$(LOADLIBES)ここではそれらは重要ではありません。)

于 2012-12-16T17:47:21.290 に答える
1

間違った順序でコンパイルされています。続行する方法は次のとおりです。

CC = gcc
CFLAGS = -Wall -W
LDFLAGS = -lm

myprog: myprog.o more_code.o
       ${CC} ${CFLAGS} myprog.o more_code.o ${LDFLAGS} -o myprog

myprog.o: myprog.c
       ${CC} ${CFLAGS} -c myprog.c

more_code.o: more_code.c
       ${CC} ${CFLAGS} -c more_code.c

clean:
       \rm myprog.o more_code.o myprog 

詳細:http ://www.physics.utah.edu/~p5720/rsrc/make.html

元のmakefileで見せてもらえますか?私は試すことができます :)

CC = gcc
CFLAGS = -Wall -W
LDFLAGS = -lm
OBJECTS = setitimer-helper.o squish-pty.o squish-unix.o

all: setitimer-helper

setitimer-helper: $(OBJECTS)
       ${CC} ${CFLAGS} $(OBJECTS) ${LDFLAGS} -o setitimer-helper

setitimer-helper.o: setitimer-helper.c
       ${CC} ${CFLAGS} -c setitimer-helper.c

squish-pty.o: squish-pty.c
       ${CC} ${CFLAGS} -c squish-pty.c

squish-unix.o: squish-unix.c
       ${CC} ${CFLAGS} -c squish-unix.c

また、Makefileを初めて使用する場合は、CFLAGSに-Wextra-pedanticを追加することをお勧めします。

于 2012-12-16T11:40:15.547 に答える