gcc编译问题

来源:互联网 发布:风暴幻想坐骑进阶数据 编辑:程序博客网 时间:2024/05/09 16:48

    从起点开始,打好基础,开始linux下C编程的旅程~~

linux 2.4.20
进行编译test
[root@m9s xltest]# gcc -o test test.c   
In file included from /usr/include/errno.h:36,
                 from test.c:8:
/usr/include/bits/errno.h:25:26: linux/errno.h: No such file or directory

手动改了两个文件把原有的路径改成绝对路径了:
修改/usr/include/bits/errno.h
将# include <linux/errno.h>
修改成#include </usr/src/linux-2.4/include/linux/errno.h>

[root@m9s xltest]# gcc -o test test.c
/tmp/ccAwcENr.o(.text+0xa3): In function `main':
: undefined reference to `sin'
collect2: ld returned 1 exit status

书上记载(稍做修改):
    (编译的时候要加 -lm 以便连接数学函数库  include/math.h)
    出现这个错误是因为编译器找不到 sin 的具体实现.虽然我们包括了正确的头文件,但是我们在编译的时候还是要连接确定的库.在 Linux 下,为了使用数学函数,我们必须和数学库连接,为此我们要加入 -lm 选项. gcc -o test test.c -lm这样才能够正确的编译.对于一些常用的函数(如printf)的实现,gcc编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了.有时候我们在编译程序的时候还要指定库的路径,这个时候我们要用到编译器的 -L 选项指定路径.比如说我们有一个库在 /home/hoyt/mylib下,这样我们编译的时候还要加上-L /home/hoyt/mylib.对于一些标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径.
   有时候我们使用了某个函数,但是我们不知道库的名字,这个时候首先,我到标准库路径下面去找看看有没有和我用的函数相关的库, 当然,如果找不到,只有一个笨方法.比如我要找 sin 这个函数所在的库.  就只好用 nm -o /lib/*.so|grep sin>~/sin 命令,然后看~/sin 文件,到那里面去找了.  在 sin 文件当中,我会找到这样的一行 libm-2.1.2.so: 00009fa0 W sin 这样我就知道了 sin在 libm-2.1.2.so库里面,我用 -lm选项就可以了(去掉前面的 lib 和后面的版本标志,就剩下 m 了所以是 -lm).

本例代码如下:

 

原创粉丝点击