7

私は問題なく単純なMakefileを実行しています:

CC=gcc
CFLAGS= -std=c99 -ggdb -Wall -I.
DEPS = hellomake.h
OBJ = hellomake.o hellofunc.o 

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

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS)

ファイルはメインプロジェクトのディレクトリにあります。

./project/Makefile
./project/hellomake.c
./project/hellomake.h

次に、ファイルを整理して、次のように配置しようとしました。

./project/Makefile
./project/src/hellomake.c
./project/include/hellomake.h

および追加のサブディレクトリディレクトリ:

./project/lib
./project/obj

次に、Makefileの新しいバージョン:

IDIR =include
CC=gcc
CFLAGS= -std=c99 -ggdb -Wall -I$(IDIR)

ODIR=obj
LDIR =lib

LIBS=-lm

_DEPS = hellomake.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = hellomake.o hellofunc.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

hellomake: $(OBJ)
    gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

私はgccコンパイラでEmacsを使用してLinuxでコンパイルしています:

$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

次に、Emacsで実行します。

<Esc> 
x
compile
make

そしてそれはメッセージを与えます:

"./project/src/" -*-
make: *** No rule to make target `obj/hellomake.o', needed by `hellomake'.  Stop.
Compilation exited abnormally with code 2 at Wed Oct  3 17:10:01

Makefileファイルに含めるには、どのルールが欠落している必要がありますか?

すべてのコメントと提案は高く評価されています。


あなたの提案をありがとう、それはコードに追加されます。次に、コンパイラは次のように文句を言います。

make -k 
make: *** No rule to make target `src/hellomake.c', needed by `obj/hellomake.o'.
make: *** No rule to make target `../include/hellomake.h', needed by `obj/hellomake.o'.
make: Target `obj/hellomake.o' not remade because of errors

他の提案はありますか?

前もって感謝します!

4

3 に答える 3

12

エラーを修正するにはmake: *** No rule to make target 'obj/hellomake.o', needed by 'hellomake'. Stop.

この行を変更します。

$(ODIR)/%.o: %.c $(DEPS) 

に:

$(OBJ): $(ODIR)/%.o: src/%.c $(DEPS)

これにより、変数内のすべてのオブジェクトのルールが作成され$(OBJ)ます。2番目のパラメーター(' $(ODIR)/%.o')は、ファイル名だけを3番目のパラメーター('')に渡すために、フルパスからファイル名を抽出しますsrc/%.c

于 2012-10-03T15:17:03.053 に答える
-1

Ok。ここで見つけた別の例を試しています[ SRC、OBJ、およびBINサブディレクトリを使用してCプロジェクトのMakefileを作成するにはどうすればよいですか?]そしてここに行きます:

TARGET   = hi.sh
CC       = gcc
# compiling flags here
CFLAGS   = -std=c99 -ggdb -Wall -I./src
TARGET   = bin/hi.sh

LINKER   = gcc -o
# linking flags here
LFLAGS   = -Wall -I. -lm

# change these to set the proper directories where each files shoould be
SRCDIR   = src
OBJDIR   = obj
BINDIR   = bin

SOURCES  := $(wildcard $(SRCDIR)/*.c)
INCLUDES := $(wildcard $(SRCDIR)/*.h)
OBJECTS  := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
rm       = rm -f


$(BINDIR)/$(TARGET): $(OBJECTS)
    @$(LINKER) $(TARGETPATH)/$(TARGET) $(LFLAGS) $(OBJECTS)
    @echo "Linking complete!"

OBJECTS  := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)

$(OBJECTS): $(OBJDIR)/%.o : $(SRCDIR)/%.c
    $(CC) $(CFLAGS) -c $< -o $@
    @echo "Compiled "$<" successfully!"

.PHONEY: clean
clean:
    @$(rm) $(OBJECTS)
    @echo "Cleanup complete!"

.PHONEY: remove
remove: clean
    @$(rm) $(BINDIR)/$(TARGET)
    @echo "Executable removed!"

ファイルは次のように編成されています。

./project/bin/ executable
./project/ojb/*.0
./project/src/*.c and *.h
./project/Makefile

コンパイラは、次の1つの苦情だけを出し続けます。

make -k 
/usr/bin/ld: cannot open output file /bin/hi.sh: Permission denied
collect2: ld returned 1 exit status
make: *** [bin/bin/hi.sh] Error 1

すべてのコメントと提案をありがとう!

于 2012-10-04T07:52:51.270 に答える
-1

この行を変更する必要があると思います

$(ODIR)/%.o: %.c $(DEPS)

への変更

$(ODIR)/%.o : %.c $(DEPS)

%.oの後にスペースを追加します。

于 2021-09-16T09:32:22.787 に答える