对'main'的未定义引用使用makefile时

时间:2016-01-14 06:24:04

标签: c gcc makefile

我有四个文件list list.h list.c test_list.c

list.h

Makefile

list.c

#ifndef List_H
#define List_H
#endif
/*nothing else*/

test_list.c

#include "list.h"
#include <stdio.h>
#include <stdlib.h>
/*nothing else*/

生成文件

#include "list.h"
#include <stdio.h>   
int main(){
    return 0;
}
/*nothing else*/

当我在shell中输入make时,出现错误:

  

/ usr / bin / ld:/usr/lib/debug/usr/lib/i386-linux-gnu/crt1.o(.debug_line):重定位0具有无效的符号索引2       /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crt1.o:在函数CC=cc CXX=CC CCFLAGS= -g -std=c99 -Wall -Werror all: list test_list %.o : %.c $(CC) -c $(CCFLAGS) $< test_list: list.o test_list.o $(CC) -o test_list list.o test_list.o test: test_list ./test_list clean: rm -f core *.o test_list main&#39;       collect2:错误:ld返回1退出状态       make:*** [list]错误1

这里有什么问题?

3 个答案:

答案 0 :(得分:7)

您尚未指定用于构建目标list的规则,因此make推断了以下规则,该规则失败,因为您的{{1}中没有main函数}}

list.c

由于cc list.c -o list 不应该构建为可执行文件(不是主要版本),因此不要尝试在list中构建list作为目标,然后{{1}将正确构建。

Makefile

答案 1 :(得分:3)

您定义了目标列表,但没有为其定义规则。因此,请尝试通过发出以下命令来尝试其隐式规则来生成此目标规则

cc     list.c   -o list

这样你就得到了链接错误,因为list.c中没有名为main的符号

您可以通过运行

来了解隐式规则的工作原理
make -r

答案 2 :(得分:2)

您已经将您的计划构建为test_list,因此无需list目标。

变化:

all: list test_list

要:

all: test_list