1

我正在尝试按照此处的教程进行操作:

http://cocoadevcentral.com/articles/000081.php

当我到达“头文件”部分时,gcc test1.c -o test1在 Mac OSX 命令行中运行后,我不断收到一条奇怪的错误消息:

Undefined symbols for architecture x86_64:
  "_sum", referenced from:
      _main in ccdZyc82.o
  "_average", referenced from:
      _main in ccdZyc82.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

数学函数.h:

int sum(int x, int y);
float average(float x, float y, float z);

数学函数.c:

int sum(int x, int y) {
  return x + y;
}

float average(float x, float y, float z) {
  return (x + y + z)/3;
}

最后,我的 test1.c:

#include <stdio.h>
#include "math_functions.h"

main() {
  int thesum = sum(1, 2);
  float ave = average(1.1, 2.21, 55.32);

  printf("sum = %i\nave = %f\n(int)ave = %i\n", thesum, ave, (int)ave);
}

我似乎正确地遵循了一切,我不明白那个错误来自哪里。帮助?

4

2 回答 2

2

您有两个单独的源文件,math_functions.c 和 test1.c,它们都需要编译并链接在一起。错误消息告诉你编译器没有找到函数averagefloat那是因为它们来自 math_functions.c 而你只编译了 test1.c。

您链接到的示例告诉您键入:

gcc test3.c math_functions.c -o test3
于 2012-07-16T09:21:18.053 回答
1

您没有在包含sum()andaverage()函数的目标文件中进行链接。

做这个:

$ gcc -c -o math_functions.o math_functions.c
$ gcc -c -o test1.o test1.c
$ gcc -o test1 test1.o math_functions.o

前两行将源文件编译为目标文件,最后一行将目标文件链接到可执行文件中。

您需要花一些时间学习make,因为没有开发人员会费心输入那么多内容来编译(在您知道之前,您的文件名错误并编译了您的源文件!)。

于 2012-07-16T09:16:27.430 回答