【问题标题】:Undefined reference to `main' when using makefile使用 makefile 时对“main”的未定义引用
【发布时间】:2016-04-19 09:16:57
【问题描述】:

我有四个文件list.hlist.ctest_list.cMakefile

list.h

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

list.c

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

test_list.c

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

生成文件

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

当我在 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:在函数_start':(.text+0x18): undefined reference tomain' collect2:错误:ld 返回 1 个退出状态 make: *** [列表] 错误 1

这里有什么问题?

【问题讨论】:

  • 顺便说一句,您的"%.o 规则与隐式规则的作用相同。但是您可能应该为list.o 制作一个,以将依赖项添加到list.h

标签: c gcc makefile


【解决方案1】:

您尚未指定用于构建目标 list 的规则,因此 make 正在推断以下规则,但由于您的 list.c 中没有 main 函数而失败。

cc     list.c   -o list

由于无论如何都不应该将list 构建为可执行文件(不是主程序),所以不要尝试将list 构建为Makefile 中的目标,然后test_list 将正确构建。

all:  test_list

【讨论】:

  • 谢谢,正好解决了我的问题,老师喜欢写all: test_list test,这样比较标准吗?我不知道目标是否应该都是链接后的二进制文件。
  • @brickmanjim,是的,通常使用目标all 和实际的二进制目标作为依赖项。
  • 我的意思是all: test_list test中的第二个目标test,它不是二进制文件但也在all
  • @brickmanjim,我已经看到了两种方式,但我更经常看到独立于 all 目标的 test 目标。也就是说,默认的构建目标也不执行测试。
【解决方案2】:

您定义了一个目标list,但没有为其定义规则。所以 make 尝试了它的隐式规则,通过发出以下命令来生成这个目标规则

cc     list.c   -o list

所以你得到了链接错误,因为在 list.c 中没有名为 main 的符号

你可以通过运行看到隐式规则是如何工作的

make -r

【讨论】:

    【解决方案3】:

    您已经将程序构建为test_list,因此不需要list 目标。

    变化:

    all: list test_list
    

    收件人:

    all: test_list
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      • 2012-08-27
      • 2022-11-02
      • 2021-12-26
      • 2012-08-16
      相关资源
      最近更新 更多