只是一个简单的程序,但我不断地遇到这个编译器错误.我用MinGW做编译器.

这是头文件,point.h:

//type for a Cartesian point
typedef struct {
  double x;
  double y;
} Point;

Point create(double x, double y);
Point midpoint(Point p, Point q);

以下是point.c条:

//This is the implementation of the point type
#include "point.h"

int main() {
  return 0;
}
Point create(double x, double y) {
  Point p;
  p.x = x;
  p.y = y;
  return p;
}

Point midpoint(Point p, Point q) {
  Point mid;
  mid.x = (p.x + q.x) / 2;
  mid.y = (p.y + q.y) / 2;
  return mid;
}

这就是编译器问题的用武之地.我一直收到:

测试点.c:对"创建(双x,双y)"的未定义引用

虽然它的定义很明确.C

这是一个名为testpoint.c的单独文件:

#include "point.h"
#include <assert.h>
#include <stdio.h>
int main() {
  double x = 1;
  double y = 1;
  Point p = create(x, y);

  assert(p.x == 1);
  return 0;
}

我不知道这是什么问题.

推荐答案

你是如何编译和链接的?您需要指定这两个文件,例如:

gcc testpoint.c point.c

...这样它就知道如何将两者的功能连接在一起.然而,按照现在编写的代码,您将遇到相反的问题:main的多个定义.你需要/想要消除一个(毫无疑问是c点中的那个).

在一个更大的程序中,通常会分别编译和链接,以避免重新编译任何未更改的内容.通常通过makefile指定需要做什么,并使用make来完成工作.在这种情况下,你会有这样的东西:

OBJS=testpoint.o point.o

testpoint.exe: $(OBJS)
    gcc $(OJBS)

第一个只是一个用于目标文件名称的宏.你可以把它扩大到$(OBJS).第二个规则告诉make 1)可执行文件依赖于目标文件,2)告诉它在与目标文件相比过期时如何创建可执行文件.

make的大多数版本(包括MinGW中的版本)都有一个内置的"隐式规则",告诉他们如何从C源文件创建对象文件.它通常大致如下所示:

.c.o:
    $(CC) -c $(CFLAGS) $<

这假设C编译器的名称位于名为CC(隐式定义如CC=gcc)的宏中,并允许您在名为CFLAGS的宏中指定您关心的任何标志(例如,CFLAGS=-O3以启用优化),$<是一个特殊的宏,可扩展到源文件的名称.

您通常将其存储在名为Makefile的文件中,要构建您的程序,只需在命令行中键入make即可.它隐式查找名为Makefile的文件,并运行它包含的任何规则.

这样做的好处是,make会自动查看文件上的时间戳,因此它只会重新编译自上次编译以来已更改的文件(即".c"文件的时间戳比匹配的".o"文件更近的文件).

还要注意的是,1)在大型项目中如何使用make有很多变化,2)也有很多可供 Select 的方法.我只触及了最低点.

C++相关问答推荐

生成C代码时自动复制/生成' tmwtypes.h '依赖项

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

C strlen on char array

你能用自己的地址声明一个C指针吗?

字符数组,字符指针,在一种情况下工作,但在另一种情况下不工作?

为什么下面的递归基本情况在C中不起作用?

字符串令牌化xpath表达式

C:scanf(%d&q;,...)输入只有一个减号

初始变量重置后,char[]的赋值将消失

预先分配虚拟地址空间的区域

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

将 struct 数组写入二进制文件时发生Valgrind错误

C++中PUTS函数的返回值

为什么我无法访问C语言中的文件

浮动目标文件,数据段

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

函数指针作为函数参数 - 应该使用 const 吗?

变量的指针右对齐,函数的指针左对齐