C 生成依赖于其他对象文件的对象文件

C 生成依赖于其他对象文件的对象文件,c,makefile,gnu-make,object-files,C,Makefile,Gnu Make,Object Files,编辑:包括指向我的makefile的链接 我有一个主程序,它调用在其他源文件中定义的一系列函数。这不是问题,因为我正在使用cc-c functionSource.cfunctionHeader.h并在使用cc main.c func1.o func2.o…编译主程序之前生成目标文件-o测试。o 当我的一个函数依赖于另一个函数时,我遇到了问题。 例如: 我的主程序调用一个shuffle函数,它在自己的源文件中定义,shuffle函数调用一个swap函数,而swap函数又在自己的源文件中定义 当我尝

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

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

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

当我尝试使用
cc-cshuffle.o
为我的主程序生成shuffle.o文件时,我得到了一个
未定义的swap参考
错误

当我尝试
cc shuffle.cswap.o
时,我得到一个
未定义的对main
错误的引用

这是我的

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

这与make无关。您需要一本介绍C编程的书,这本书将解释如何使用预处理器,您需要检查编译器的文档,以便了解不同编译器标志的作用(例如何时要使用
-C
标志,何时不使用,以及区别是什么)


在编译行中包含头文件(
.h
文件)是错误的。在构建对象(
.o
)文件时,命令行上只应包含源文件(
.c
)。您应该使用
#include
指令将所需的标题添加到
.c
文件中:
#include“insertionSort.h”
。如果缺少对函数的引用,则包含声明该函数的头文件:
\include“swap.h”
这与make无关。您需要一本介绍C编程的书,这本书将解释如何使用预处理器,您需要检查编译器的文档,以便了解不同编译器标志的作用(例如何时要使用
-C
标志,何时不使用,以及区别是什么)


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

查看手册页:“-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) 坚持目标文件和程序的命名应与源代码相同的约定
例如:


etc-你明白了。

看看手册页:“-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) 坚持目标文件和程序的命名应与源代码相同的约定
例如:


etc-您明白了。

为什么要在编译器行中包含头文件?头文件应通过
#在
insertionSort.c
文件中包含“insertionSort.h”
找到(如果头文件位于同一目录中,或使用正确的路径或路径环境)。另外,在<代码>插入排序> h >代码>中声明<代码>交换<代码>吗?请参阅下面的我的答案,我认为这是一个解决方案。您的“未定义引用”是由于您忘记指定'-c',因此编译器尝试链接(并且缺少main)。否则,生成可执行文件的方法基本正确:只需生成InsertionSort.o并将其添加到用于链接的命令行。如果使用-c编译insertionSort.c(您应该这样做),那么在命令行中指定任何.o文件都是无用的。swap.h中没有声明swap,swap.c中也没有实现swap。swap.h包含在insertionSort.c中。我正在阅读的makefile教程在编译器行上列出了所有头文件,我也这样做了。makefile的头文件可能在“依赖项”行上,而不是编译器执行行上。“我正在阅读的makefile教程在编译器行上列出了所有头文件”。那么教程就错了(顺便问一下:你有链接吗?)。编译器将忽略命令行上的头文件。头文件通过在源文件中使用#include拉入。我希望我能告诉你我自己的makefile教程,但不幸的是,它是用德语写的……为什么在编译器行中包含头文件?头文件应通过
#在
insertionSort.c
文件中包含“insertionSort.h”
找到(如果头文件位于同一目录中,或使用正确的路径或路径环境)。另外,在<代码>插入排序> h >代码>中声明<代码>交换<代码>吗?请参阅下面的我的答案,我认为这是一个解决方案。您的“未定义引用”是由于您忘记指定'-c',因此编译器尝试链接(并且缺少main)。否则,生成可执行文件的方法基本正确:只需生成InsertionSort.o并将其添加到用于链接的命令行。如果您使用-c编译insertionSort.c(您应该这样做)