构建依赖于其他目标文件的目标文件

时间:2013-09-04 17:35:05

标签: c makefile gnu-make object-files

编辑:包含指向我的makefile的链接

我有一个主程序调用其他源文件中定义的一堆函数。这不是问题,因为我在使用cc -c functionSource.c

编译主程序之前使用cc main.c func1.o func2.o .... -o test.o functionHeader.h 并生成目标文件

当我的一个功能依赖于另一个功能时,我遇到了问题。 例如: 我的主程序调用一个shuffle函数,该函数在它自己的源文件中定义,shuffle函数调用一个swap函数,而swap函数又在它自己的源文件中定义。

当我尝试使用cc -c shuffle.o为我的主程序生成shuffle.o文件时出现undefined reference to swap错误。

当我尝试cc shuffle.c swap.o时出现undefined reference to main错误。

这是我的makefile

如何修复此问题? 发现了问题。我在insertSort.h和shuffle.h中声明了一个swap函数,但没有实现。

2 个答案:

答案 0 :(得分:2)

查看手册页:' - c'使编译器仅生成目标文件(不尝试链接)。

执行以下操作:

cc -c insertionSort.c     # => gives insertionSort.o
cc -c -c functionSource.c # => gives functionSource.o
cc insertionSort.o functionSource.o ...and-so-on... main.c -o test 

没有必要指定头文件 - 它没有帮助。

顺便说一句:如果你有一个比一个实现文件,它是非常有用的

  • (a)学习制作
  • (b)坚持以下惯例:目标文件和程序应该像源一样命名。

E.g:

foo.c => foo.o
bar.c => bar

等 - 你得到了照片。

答案 1 :(得分:1)

这与make无关。您需要获得一本关于C编程入门的书,它将解释如何使用预处理器,您需要检查编译器的文档,以便了解不同的编译器标志的作用(例如何时使用{{ 1}}标志,当你不这样做,以及有什么区别)。

在编译行中包含头文件(-c文件)是错误的。构建对象(.h)文件时,命令行中只应包含源文件(.c)。您应该使用.o指令将所需的标头添加到.c文件中:#include。如果您缺少对函数的引用,那么#include "insertionSort.h"声明该函数的头文件:#include