a86116403 发表于 2020-2-1 21:45:23

带你学C带你飞第7课,gcc -lm test.c && ./a.out中间为什么加-lm

图片上传不了真尴尬。
程序我是一摸一样抄下来的,然后我输出是

gcc test.c && ./a.out   没问题,也试了一下

gcc -lm test.c && ./a.out    没问题,也试了一下

gcc test.c -o test
./test   没问题   最后试了一下

gcc -lm test.c -o test
./test    没问题


视频里说这个是调用math.h这个函数库,如果我没用-lm就是没有调用,应该是报错或者输出异常才对,怎么正常了

jackz007 发表于 2020-2-2 00:40:47

本帖最后由 jackz007 于 2020-2-2 00:49 编辑

      "math.h" 是头文件,不是数学库,对 Linux 系统而言,所谓的数学库指的是 "libm.so",是操作系统提供的一个动态库,类似于 Windows 系统的 dll 文件。
      
       如果在代码中用到了 C 语言提供的数学函数,例如:pow()、sqrt() 、sin()、tan() 等,就必须在代码开头包含头文件 "math.h",在代码编译的时候,必须添加 -lm 选项,否则,一定会出错。

       如果在代码中并没有使用到 C 语言的数学库函数,在代码开头也可以包含头文件 "math.h",在代码编译的时候,也同样可以使用 -lm 选项,难道有什么问题吗?

       如果在 Windows 下使用 DEV-C++,其他要求都和 Linux 系统完全一样,只是编译的时候,完全不需要添加 -lm 选项。

a86116403 发表于 2020-2-2 13:53:08

jackz007 发表于 2020-2-2 00:40
"math.h" 是头文件,不是数学库,对 Linux 系统而言,所谓的数学库指的是 "libm.so",是操作系统提供 ...

引用一下你的话“如果在代码中用到了 C 语言提供的数学函数,例如:pow()、sqrt() 、sin()、tan() 等,就必须在代码开头包含头文件 "math.h",在代码编译的时候,必须添加 -lm 选项,否则,一定会出错。”

用的linux系统,gcc test.c -o test编译没报错,只有溢出警告,然后执行./test,输出也正常,为什么,没有加-lm,你不是说一定会出错吗

jackz007 发表于 2020-2-2 14:58:57

a86116403 发表于 2020-2-2 13:53
引用一下你的话“如果在代码中用到了 C 语言提供的数学函数,例如:pow()、sqrt() 、sin()、tan() 等,就 ...

   关键是,你在代码中用数学函数了吗?

a86116403 发表于 2020-2-2 16:46:57

jackz007 发表于 2020-2-2 14:58
关键是,你在代码中用数学函数了吗?

用了,pow,我程序是抄下来的

a86116403 发表于 2020-2-2 16:54:38

jackz007 发表于 2020-2-2 14:58
关键是,你在代码中用数学函数了吗?

#include<stdoo.h>
#include<math.h>

int main()
{
          int result =pow(2,32)-1;
          printf("result=%d",result);

          return 0;
}

源代码文件是test.c,用gcc编译
gcc test.c -o tset    编译通过,警告溢出

执行编译后文件
./test
输出到页面   
result= 2147483647

a86116403 发表于 2020-2-2 16:55:24

jackz007 发表于 2020-2-2 14:58
关键是,你在代码中用数学函数了吗?

#include<stdoo.h>
#include<math.h>

int main()
{
          int result =pow(2,32)-1;
          printf("result=%d",result);

          return 0;
}

源代码文件是test.c,用gcc编译
gcc test.c -o tset    编译通过,警告溢出

执行编译后文件
./test
输出到页面   
result= 2147483647
页: [1]
查看完整版本: 带你学C带你飞第7课,gcc -lm test.c && ./a.out中间为什么加-lm