Makefile和"重定位具有无效符号索引"错误

pyt*_*hon 2 c gcc makefile

我正在尝试编写我的第一个makefile.在我的项目中,我有这些文件:

  • main.c中
  • list.c
  • list.h
  • Makefile文件

其中任何一个都没有函数定义或声明,只需要简单include "list.h"干净的主要来测试编译过程.当我使用命令在控制台中编译这些文件时:

gcc -std=c99 -Wall -Wextra main.c list.c

一切都很好,但是当我使用我的Makefile(在Qt Creator和Gome终端中)时,我遇到了很多错误:

:-1: error: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11.

这是我的Makefile:

CC=gcc
CFLAGS=-std=c99 -Wall -Wextra
LDFLAGS=

all: listtest

listtest: main.o list.o
    $(CC) main.o list.o -o listtest

main.o: main.c
    $(CC) $(CFLAGS) main.c

list.o: list.c
    $(CC) $(CFLAGS) list.c

clean:
    rm -rf *o listtest
Run Code Online (Sandbox Code Playgroud)

这是我用来创建它的makefile教程.这个makefile有什么问题,如何解决?

http://mrbook.org/tutorials/make/

Max*_*kin 5

你错过-c了你的.o规则:

main.o: main.c
    $(CC) -c -o main.o $(CFLAGS) main.c

list.o: list.c
    $(CC) -c -o list.o $(CFLAGS) list.c
Run Code Online (Sandbox Code Playgroud)

更好的规则是:

%.o : %.c
    $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $<
Run Code Online (Sandbox Code Playgroud)

这种模式本质上的规则是建立在内置的规则.o.c,见隐含规则的make的目录.换句话说,您不需要编写任何上述规则.


一个更好的规则是:

%.o : %.c
    $(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ -MD -MP -MF ${@:.o=.d} $<
Run Code Online (Sandbox Code Playgroud)

这会自动为您生成依赖项.这些依赖项需要包含在makefile中(在后续运行中):

-include $(wildcard *.d)
Run Code Online (Sandbox Code Playgroud)