从头文件中声明的另一个文件调用函数

时间:2015-03-30 03:35:53

标签: c function external

我想调用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

4 个答案:

答案 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