0

ルート ディレクトリと子ディレクトリがあります。関数を子ディレクトリの下に配置する予定ですlibfunc.o

これlibfunc.oは、最上位ディレクトリの他のオブジェクト ファイルと一緒にマージする必要があります。しかし、私はエラーが発生しています:

 $make all
  cd folder; make libfunc.o
  make[1]: Entering directory `/home/Work/test_makefile/folder'
  cc -c -o func2.o func2.c
  cc -c -o func3.o func3.c
  func3.c: In function ‘set’:
  func3.c:3:25: warning: initialization makes pointer from integer without a cast [enabled by default]
  ld  -r -o libfunc.o func2.o func3.o
  make[1]: Leaving directory `/home/Work/test_makefile/folder'
 arm-linux-gnueabi-gcc -c -o hellofun.o hellofun.c  -I. -I./include
 arm-linux-gnueabi-gcc -c -o hellomake.o hellomake.c  -I. -I./include
 arm-linux-gnueabi-gcc hellofun.o hellomake.o folder/libfunc.o -o hm
 folder/libfunc.o: file not recognized: File format not recognized
 collect2: ld returned 1 exit status
 make: *** [hm] Error 1

Makefile: トップレベル

  1 CC=arm-linux-gnueabi-gcc
  2 LD=arm-linux-gnueabi-ld
  3 AR=arm-linux-gnueabi-ar
  4 CFLAGS=-I. -I./include
  5 SOURCES=hellofun.c hellomake.c
  6 OBJECTS=$(SOURCES:.c=.o)
  7 SUBDIR_OBJS=folder/libfunc.o
  8 TARGET=hm
  9 DEPS = hellomake.h
 10 
 11 %.o: %.c $(DEPS) $(SUBDIR_OBJS)
 12         $(CC) -c -o $@ $<  $(CFLAGS)
 13 
 14 folder/libfunc.o:
 15         cd folder; $(MAKE) libfunc.o
 16 
 17 clean:
 18         rm -rf *.o hellomake folder/*.o 
 19 
 20 all: $(SOURCES) $(TARGET)
 21 
 22 $(TARGET): $(OBJECTS)
 23         $(CC) $(OBJECTS) $(SUBDIR_OBJS) -o $@
 24

Makefile : 子

  1 SOURCES=$(wildcard *.c)
  2 OBJECTS=$(SOURCES:.c=.o)
  3 TARGET=libfunc.o
  4 %.o: %.c 
  5         $(CC) -c -o $@ $<  $(CFLAGS)
  6 
  7 clean:
  8         rm -rf *.o      
  9 
 10 
 11 $(TARGET): $(OBJECTS)
 12         $(if $(strip $(OBJECTS)),\
 13                       $(LD) $(LDFLAGS) -r -o $@ $(OBJECTS),\
 14                       rm -f $@; $(AR) rcs $@ )

~
~
~

4

3 に答える 3

0

ルート makefile にエクスポート CC がありませんでした

于 2013-09-18T06:13:10.617 に答える
0

ここには複数のエラーがあります。まず、質問をするときは、常に完全なエラー メッセージを提供してください。no rule to make targetエラーは、作成しようとしているターゲットを出力します。それはあなたを助けるための重要な情報です。

次に、 variable を参照しますSUBDIR_OBJSが、それは定義されていません。さらに、ルールで他のオブジェクト ファイルを構築するための前提条件としてそれ%.o : %.cをリストします。オブジェクト ファイルを他のオブジェクト ファイルの前提条件としてリストすることは事実上決して正しくありません。

最上位の makefile はディレクトリ内で make を実行しないため、そのfolderディレクトリ内のコマンドは自動的に実行されません。あなたはそこに行きmake、手で走らなければなりません。

またconfig.mk、変数を作成しますmerge_objectが、変数folder/Makefileを参照しますがmerge_objects、これは同じ変数ではありません。

于 2013-09-18T04:14:06.847 に答える