我正在为我的Linux课程完成一些作业,其中一个作业教会我们使用makefile。我设法让我创建的makefile正常运行,所以不用担心,你不会剥夺我的知识。也就是说,我对我的计划的行为感到困惑。
我使用makefile将4个源文件编译成一个程序。 3个源文件由一个函数组成,它基本上只使用math.h中的标准函数来执行计算,返回一个double。例如:
#include <math.h>
double sqroot(double arg)
{
arg = (sqrt(arg));
return arg;
}
一个源文件调用所有这三个函数。
#include <math.h>
double sum(double arg)
{
arg = (sqroot(arg) + square(arg) + sine(arg));
return arg;
}
主要内容如下:
#include <stdio.h>
void main(int argc, char *argv[])
{
double num=atoi(argv[1]);
printf("the sine of %lf in radians is %lf\n", num, (sine(num)));
printf("the square root of %lf is %lf\n", num, sqroot(num));
printf("the square of %lf is %lf\n", num, square(num));
printf("the sum of all of these is %lf\n", sum(num));
}
程序编译没有问题,但是当我运行程序时,它会输出错误的值。
使用GDB,我已经检查了每个函数的返回变量的值,这个值是正确的,但在进入main之后,值不一样。当我只使用构造函数将这些函数放在main中时,程序就会按预期运行。
示例终端输出:
eng-svr-1:/home/jhazel/Desktop/Linux/257/hw8>make all
gcc -c main.c sine.c sqrt.c square.c sum.c -lm
gcc -o HEYTHERE main.o sine.o sqrt.o square.o sum.o -lm
gcc -g main.c sine.c sqrt.c square.c sum.c -lm
eng-svr-1:/home/jhazel/Desktop/Linux/257/hw8>./HEYTHERE 2
the sine of 2.000000 in radians is 0.000000
the square root of 2.000000 is 0.000000
the square of 2.000000 is 0.000000
the sum of all of these is 0.000000
eng-svr-1:/home/jhazel/Desktop/Linux/257/hw8>
我是否错误地构建了makefile?用不正确的命令编译?或者我在源文件中遗漏了什么?
答案 0 :(得分:0)
感谢MikeCat建议在我的makefile中使用-Wall -Wextra
,我能够确定我没有包含其他源文件中实现的函数的声明。
为了解决这个问题,我提供了一个带声明的头文件:
double square(double arg);
double sine(double arg);
double sqroot(double arg);
到sum和main源文件,另外double sum(double arg);
到main。