yzc123 发表于 2021-2-2 21:05:48

各位老哥帮忙看看

人中仙 发表于 2021-2-2 21:05:49

gcc在链接过程中是从左到右扫描的,故参数-lm要放在命令的最后;
试试使用以下命令:

gcc -o 14 14.c -lm

sunrise085 发表于 2021-2-2 21:42:55

linux下,使用math.h的时候,不能这么简单的gcc
需要在gcc yoursourcefile.c 的时候加上' -lm' ,
"gcc -lm yoursourcefile.c" 编译通过,应该就可以了

client_2233 发表于 2021-2-2 21:58:19

gcc -lm -o l4.out

yzc123 发表于 2021-2-3 08:32:07

sunrise085 发表于 2021-2-2 21:42
linux下,使用math.h的时候,不能这么简单的gcc
需要在gcc yoursourcefile.c 的时候加上' -lm' ,
"gcc - ...

还是不行啊?

yzc123 发表于 2021-2-3 19:59:58

人中仙 发表于 2021-2-3 11:55
gcc在链接过程中是从左到右扫描的,故参数-lm要放在命令的最后;
试试使用以下命令:

还是不行

client_2233 发表于 2021-2-3 20:53:43

人中仙 发表于 2021-2-3 11:55
gcc在链接过程中是从左到右扫描的,故参数-lm要放在命令的最后;
试试使用以下命令:

这些应该放中间吧

人中仙 发表于 2021-2-4 12:48:56

本帖最后由 人中仙 于 2021-2-4 13:07 编辑

yzc123 发表于 2021-2-3 19:59
还是不行

我在我的电脑上试了一下是可以的,运行情况如下:

代码片段:
#include <stdio.h>
#include <math.h>

int main(){
    double a,b,c,area,s;
    a=3.67;
    b=5.43;
    c=6.21;
    s = (a+b+c)/2;;
    area = sqrt(s*(s-a)*(s-b)*(s-c));
    printf("a=%f\tb=%f\tc=%f\n",a,b,c);
    printf("area=%f\n",area);
    return 0;
}

命令行运行:
PS D:\WorkSpace\VSCode\14> gcc -o 14 14.c -lm
PS D:\WorkSpace\VSCode\14> .\14

命令行输出:
a=3.670000      b=5.430000      c=6.210000
area=9.903431

人中仙 发表于 2021-2-4 12:57:50

client_2233 发表于 2021-2-3 20:53
这些应该放中间吧

我试了一下,这一个程序放中间是可以编译的,但是一般来说应该放在末尾。

特别注意,必须把-lm放在后面。放在最后时它是这样的一个解析过程:

链接器从左往右扫描可重定位目标文件和静态库

扫描main.o时,发现一个未解析的符号exp,记住这个未解析的符号

扫描libm.a,找到了前面未解析的符号,因此提取相关代码

最终没有任何未解析的符号,编译链接完成

参考:一文带你了解静态库和动态库

yzc123 发表于 2021-2-4 14:57:12

人中仙 发表于 2021-2-4 12:48
我在我的电脑上试了一下是可以的,运行情况如下:

代码片段:


那我那个为啥不行?

人中仙 发表于 2021-2-4 15:07:43

yzc123 发表于 2021-2-4 14:57
那我那个为啥不行?

是不是环境出了问题?到目录下面看看有没有 libm.a 这个库文件。

附:Linux下gcc安装与配置

client_2233 发表于 2021-2-4 22:03:41

人中仙 发表于 2021-2-4 12:57
我试了一下,这一个程序放中间是可以编译的,但是一般来说应该放在末尾。




好的 谢谢指教
页: [1]
查看完整版本: 各位老哥帮忙看看