我正在尝试按照这里的教程:
http://cocoadevcentral.com/articles/000081.php
当我到达“Header files”部分时,在Mac OSX命令行中运行gcc test1.c -o test1
后,我一直收到一条奇怪的错误消息:
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
math_functions.h这个头文件:
int sum(int x, int y);
float average(float x, float y, float z);
math_functions.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);
}
我似乎已经正确地遵循了所有内容,但我不明白该错误的来源。帮助
答案 0 :(得分:2)
你有两个独立的源文件,math_functions.c和test1.c,它们都需要编译和链接在一起。错误消息告诉您编译器找不到函数average
和float
,这是因为它们来自math_functions.c并且您只编译了test1.c。
您链接的示例告诉您输入:
gcc test3.c math_functions.c -o test3
答案 1 :(得分:1)
您没有链接包含sum()
和average()
函数的目标文件。
这样做:
$ 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
,因为没有开发人员可以费心去编译那么多(在你知道它之前你的文件名错误并在源文件上编译了!)