Code Bye

gcc编译静态函数库:库调用出错

库文件:libtriangle.a,源文件:libtriangle.c,生成库方法:gcc libtriangle.c -c 然后ar -cr libtriangle.a libtriangle.c。
libtriagle.c源码如下:
#include <math.h>
 1 float triarea(float  x,float y,float z)
  2 {
  3         float tmp;
  4         tmp=(float)sqrt((x+y+z)*(y+z-x)*(x-y+z)*(x+y-z))/4.0;
  5         return tmp;
  6 }
主程序(t.c)源码如下:
  1 #include<stdio.h>
  2 int main()
  3 {
  4         float x,y,z,area;
  5         printf(“Please input three nums:x,y,z\n”);
  6         scanf(“%f,%f,%f”,&x,&y,&z);
  7         printf(“The area of triangle is:%f\n”,triarea(x,y,z));
  8 }
调用命令(所有文件放置在当前目录./下):
gcc t.c -L ./ -ltriarea -lm -o t
./t
然后输入:2,3,4
执行结果:
t.c: In function ‘main’:
t.c:7:3: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat=]
   printf(“The area of triangle is:%f\n”,triarea(x,y,z));
   ^
定义的triarea函数就是float型的,为什么会提示是整型呢?
如果把libtriarea.c中的sqrt去掉,把math.h头文件去掉,编译时用gcc t.c -L ./ -ltriarea -o t同样会报错。
解决方案:40分
因为t.c里面没有主动声明triarea函数, C语言对于没有声明的函数会假定返回int之类的.
c++就相对好点, 直接报错.

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明gcc编译静态函数库:库调用出错