Makefile链接错误:undefined main

时间:2013-08-27 05:01:32

标签: c gcc makefile

target: $(patsubst %.c,%.o,$(wildcard ./src/*.c))
    @echo "making target"
    $(cc) $(patsubst %.c,%.o,$(wildcard ./src/*.c)) $(LIBS) -o gif 
#   $(cc) $(wildcard ./objects/*.o) $(LIBS) -o gif 

./objects/%.o: %.c
    @echo "making objects now"
    @mkdir -p ./objs
    $(cc) $(CFLAGS) $(LDFLAGS) -c $< -o ./objects/$@

问题是对象.o文件是在src文件夹中创建的。 我希望在对象文件夹中创建对象。请帮忙吗?

输出

making target
gcc ./src/gif_display.o ./src/gif_lzw.o ./src/gif_read.o ./src/sysm.o ./src/x86_main.o -lm -lc -o gif 

2 个答案:

答案 0 :(得分:1)

以另一种方式格式化,输出如下所示:

[joshis1@(none) GIF_Utility]$ make target
echo "making target"
making target
gcc -lm -lc -o gif
/usr/lib/gcc/i686-redhat-linux/4.6.3/../../../crt1.o: In function _start': (.text+0x18): undefined reference tomain' collect2: ld returned 1 exit status make: * [target] Error 1
[joshis1@(none) GIF_Utility]$

实际的编译行是:

gcc -lm -lc -o gif

正如您所看到的,没有输入文件提供给编译器,因此问题在于您使用patsubst。如果你用这样的东西替换它,它将正确生成你想要的文件列表:

$(patsubst %.c,%.o,$(wildcard ./src/*))

答案 1 :(得分:0)

您需要修复您的patsubst才能更改目录:

$(patsubst ./src/%.c,./objs/%.o,$(wildcard ./src/*.c))