2
gcc 4.7.2
c89
GNU Make 3.82

この Makefile を使用して、このプログラムをコンパイルしようとしています。現時点では src ファイルが 1 つしかありませんが、後で追加する予定です。

Makefile を取得して bin ディレクトリが存在しない場合は作成し、そこにバイナリ実行可能ファイルを配置しようとしています。

INC_PATH=-I/home/dev_tools/apr/include/apr-1
LIB_PATH=-L/home/dev_tools/apr/lib
LIBS=-lapr-1
RUNTIME_PATH=/home/dev_tools/apr/lib
CC=gcc
CFLAGS=-Wall -Wextra -g -m32 -D_DEBUG -D_THREAD_SAFE -D_REENTRANT -D_LARGEFILE64_SOURCE -O2 $(INC_PATH)
OBJECTS=timeout.o
EXECUTABLE=bin/to

all:    build $(EXECUTABLE)

$(EXECUTABLE):
    $(CC) -m32 -o $@ -Wl,-rpath,$(RUNTIME_PATH), $(LIB_PATH) $(OBJECTS) $(LIBS)

build:
    @mkdir -p bin

clean:
    rm -rf *~ timeout *.o

このエラーが発生しています:

make
gcc -m32 -o bin/to -Wl,-rpath,/home/dev_tools/apr/lib, -L/home/dev_tools/apr/lib timeout.o -lapr-1
gcc: error: timeout.o: No such file or directory
make: *** [bin/to] Error 1

を削除する$(OBJECTS)と、次のようになります。

gcc -m32 -o bin/to -Wl,-rpath,/home/dev_tools/apr/lib, -L/home/dev_tools/apr/lib -lapr-1
/usr/bin/ld: cannot find : No such file or directory
collect2: error: ld returned 1 exit status
make: *** [bin/to] Error 1

これのどこが間違っているのかわかりません。

4

3 に答える 3

2

Makefileは少し注意が必要です。変数にさらにオブジェクトを追加し続けたいのでOBJECT、実際には、EXECUTABLEすべてのオブジェクトがコンパイルされていることを確認するための前提条件を追加します。そこから、自動ルール推論が残りの処理を行う必要があります。

基本的に、行を次のように置き換えます。

$(EXECUTABLE): $(OBJECTS)
        $(CC) -m32 -o $@ -Wl,-rpath,$(RUNTIME_PATH), $(LIB_PATH) $(OBJECTS) $(LIBS)
于 2013-01-31T04:53:55.217 に答える
2

ターゲット timeout.o のビルド方法が指定されていません。

次のコードを追加する必要があります。

timeout.o: timeout.c
            $(CC) $(CFLAGS) -c -o $@ $<

コンパイルが必要なソース ファイルがさらに増えた場合は、次のようなパターン マッチング ルールを使用できます。

%.o: %.c
        $(CC) $(CFLAGS) -c $< -o $@
于 2013-01-31T04:44:55.720 に答える
1

make が現在のディレクトリで timeout.o ファイルを見つけることができないため、エラーが表示されます。timeout.c ファイルがある場合は、makefile に以下を追加します。

OBJECTS: timeout.c

      $(CC) -c timeout.c
于 2013-01-31T04:47:08.480 に答える