0

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

我有一个主程序,它调用其他源文件中定义的一堆函数。这不是问题,因为我正在使用cc -c functionSource.c functionHeader.h并在编译我的主程序之前生成目标文件cc main.c func1.o func2.o .... -o test.o

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

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

当我尝试时,cc shuffle.c swap.o我得到一个undefined reference to main错误。

这是我的makefile

我该如何解决这个问题? 发现了问题。我在 insertSort.h 和 shuffle.h 中声明了一个交换函数,但没有实现。

4

2 回答 2

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) 坚持目标文件和程序应该像源一样命名的约定。

例如:

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

等等 - 你得到了图片。

于 2013-09-04T17:55:39.517 回答
1

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

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

于 2013-09-04T17:55:19.000 回答