Chinaunix首页 | 论坛 | 博客

分类: C/C++

2009-02-09 15:35:17

  
  刚刚我们都仅只是在萤幕上面印出一些字眼而已,如果说要计算数学公式呢?! 例如我们想要计算出三角函数里面的 sin(90度角),要注意的是,大多数的程式语言都是使用径度而不是一般我们在计算的‘角度’, 180 度角约等于 3.14 径度!嗯!那我们就来写一下这个程式吧!

  [root@linux ~]# vi sin.c
  #include
  int main(void)
  {
  float value;
  value = sin ( 3.14 / 2 );
  printf("%f\n",value);
  }
  # 上面这个档案的内容可以在底下取得!
  #

  那要如何编译这支程式呢?我们先直接编译看看:

  [root@linux ~]# gcc sin.c
  sin.c: In function 'main':
  sin.c:5: warning: incompatible implicit declaration of built-in function 'sin'
  /tmp/cciDlilg.o(.text+0x2c): In function `main':
  sin.c: undefined reference to `sin'
  collect2: ld returned 1 exit status
  # 注意看到上面最后一行,会有个错误讯息,代表没有成功!

  特别注意上面的错误讯息,唉啊!怎么没有编译成功?它说的是‘undefined reference to sin’,说的是‘没有 sin 的相关定义参考值!’,为什么会这样呢?这是因为 C 语言里面的 sin 函示是写在 libm.so 这个函式库中,而我们并没有在原始码里面加入相关的说明, 所以当然就需要在编译与连结的时候将这个函式库给他连结进执行档里面啊!所以我们可以这样做:

  [root@linux ~]# gcc sin.c -lm -L/lib -L/usr/lib
  # 特别注意,那个 -lm 可以拆开成两部份来看:
  # -l :是‘加入某个函式库(library)’的意思,而
  # m  :则是 libm.so 这个函式库,其中, lib 与副档名(.a 或 .so)不需要写
  # 所以 -lm 表示使用 libm.so (或 libm.a) 这个函式库的意思~
  # 至于那个 -L 后面接的路径呢?这表示:
  #‘我要的函式库 libm.so 请到 /lib 或 /usr/lib 里面搜寻!’
  [root@linux ~]# ./a.out
  1.000000

  上面的说明很清楚了吧!!不过,要注意的是,由于 Linux 预设是将函式库放置在 /lib 与 /usr/lib 当中,所以您没有写 -L/lib 与 -L/usr/lib 也没有关系的!不过,万一哪天您使用的函式库并非放置在这两个目录下,那么 -L/path 就很重要了!否则会找不到函式库喔!

  除了连结的函式库之外,您或许已经发现一个奇怪的地方,那就是在我们的 sin.c 当中第一行‘ #include ’,这行说的是要将一些定义资料由 stdio.h 这个档案读入,这包括 printf 的相关设定。这个档案其实是放置在 /usr/include/stdio.h 的!那么万一这个档案并非放置在这里呢?那么我们就可以使用底下的方式来定义出要读取的 include 档案放置的目录:

  [root@linux ~]# gcc sin.c -lm -I/usr/include

  -I/path 后面接的路径( Path )就是设定要去搜寻相关的 include 档案的目录啦!不过,同样的,预设值是放置在 /usr/include 底下,除非您的 include 档案放置在其他路径,否则也可以略过这个项目!

  透过上面的几个小范例,您应该对于 gcc 以及原始码有一定程度的认识了,再接下来,我们来稍微整理一下 gcc 的简易使用方法吧!

阅读(1044) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~