更新:如何调用子目录的makefile以创建可以链接的合并.o文件:

时间:2013-09-18 03:59:33

标签: c makefile

我有一个根目录和一个子目录。我打算将这些函数放在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:toplevel

  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:Child

  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 $@ )



3 个答案:

答案 0 :(得分:0)

这里有多个错误。首先,在提问时请始终提供完整的错误消息。 no rule to make target错误会打印出 目标正在尝试制作的目标;这是帮助你的重要信息。

其次,您引用变量SUBDIR_OBJS,但这从未定义过。另外,您列出了作为在%.o : %.c规则中构建其他目标文件的先决条件:将对象文件列为其他目标文件的先决条件几乎永远不正确。

顶级makefile不在folder目录中运行make,因此该目录中的命令不会自动运行。你必须自己去那里自己运行make

同样在config.mk中您创建了一个变量merge_object,但在folder/Makefile中,您引用的是变量merge_objects,它不是同一个变量。

答案 1 :(得分:0)

我在root makefile中错过了导出CC

答案 2 :(得分:0)

  1. 我建议在编译器选项中加上 -Wall 选项,以便您可以更好地调试编译过程。

  2. 输出 ld -r -o libfunc.o func2.o func3.o 对我来说似乎很可疑。看起来系统使用默认链接器而不是交叉编译链接器,它是 arm-linux-gnueabi-ld 。这可能是文件无法识别的原因。

  3. 由于错误是文件格式无法识别,您可以查看文件libfunc.o 输出吗?

  4. 如果您使用LD,为什么不跳过它并尝试其他方法,例如 gcc -o hm 包含所有目标文件,或者使用 ar 将对象打包到子文件夹中。