我想调用sin.c中的函数,主文件在test1.c中
文件看起来像这样:
file test1.c:
#include <stdio.h>
#include <stdlib.h>
#include "sin.h"
int main(){
float angle;
double sinValue;
printf("Please enter a angle: ");
scanf("%f", &angle);
sinValue = sin(angle);
printf("the sin value of this angle is: %2.7f.", sinValue);
printf("program terminated");
return 0;
}
这是头文件:
在sin.h:
extern double sin(float angle);
在档案sin.c:
#include <math.h>
#include <stdlib.h>
#define EPSILON 0.0000001;
int fact(int n);
double sin(float angle){
float rad;
float pi = M_PI;
double newSin, oldSin;
double n = 1.0;
double token;
//find the radians
rad = angle * M_PI / 180.0;
newSin = rad;
//find the approxmate value of sin(x)
while((newSin - oldSin) > EPSILON ){
oldSin = newSin;
token = 2.0 * n - 1.0;
newSin = oldSin + pow(-1.0, n) * pow(rad, token) / fact(token);
n++;
}
return newSin;
}
问题是当我编译test1.c时,错误消息显示:
sin.h:1:15: warning: conflicting types for built-in function ‘sin’ [enabled by default]
extern double sin(float angle);
^
/tmp/ccxzixfm.o: In function `main':
test1.c:(.text+0x39): undefined reference to `sin'
collect2: error: ld returned 1 exit status
make: *** [test1] Error 1
它已在头文件中声明,我也包含了头文件,所以错误是什么。我很困惑。
先谢谢,约翰。
我使用“make”命令编译test1.c
这是编译过程:
zxz111@ubuntu:~/Desktop/sin$ ls
sin.c sin.c~ sin.h test1.c test1.c~
zxz111@ubuntu:~/Desktop/sin$ make test1
cc test1.c -o test1
In file included from test1.c:3:0:
sin.h:1:15: warning: conflicting types for built-in function ‘sin’ [enabled by default]
extern double sin(float angle);
^
/tmp/ccxzixfm.o: In function `main':
test1.c:(.text+0x39): undefined reference to `sin'
collect2: error: ld returned 1 exit status
make: *** [test1] Error 1
zxz111@ubuntu:~/Desktop/sin$ make test1
答案 0 :(得分:2)
您需要将两个源文件都传递给编译器。
如果你正在使用GCC,那就是:
gcc sin.c main.c -o main
虽然您的fact()
函数似乎没有在任何地方定义,并且sin()
中已经定义了名为<math.h>
的函数,但您可能想要重命名。{/ p>
答案 1 :(得分:1)
ld返回1退出状态 ::::这是链接器错误。这意味着当您的链接器搜索符号“sin”时,它无法找到。
你得到这个错误的原因是(因为你没有添加整个sin.h,我假设),你没有在“sin.h”中包含“sin.c”。
此外,编译这两个文件以便生成sin.o,然后您的链接器就可以映射符号。
警告:内置函数'sin'的冲突类型[默认启用] extern double sin(浮角); 另外,尽量避免使用已在标准库中定义的函数名称。
答案 2 :(得分:0)
您需要确保编辑这两个文件。 因此,例如,如果您使用g ++进行编译,那么它将是:
g++ sin.c test1.c -o run
答案 3 :(得分:0)
默认情况下,函数声明具有外部链接。要消除警告,请从extern
中的函数原型中删除sin.h
。
编译时,首先编译sin.c
,但不链接例如。 cc -c sin.c
。这将生成一个目标文件,可能名为sin.o
。
然后你可以编译test1.c
,将你的目标文件链接到它中:cc test1.c sin.o -o test1