从起点开始,打好基础,开始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).
本例代码如下:
//test.c #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <errno.h> #include <math.h> int main() { pid_t child; int status; printf("This will demostrate how to get child status/n"); if((child=fork())==-1) { printf("Fork Error :%s/n",strerror(errno)); exit(1); } else if(child==0) { int i; printf("I am the child:%ld/n",getpid()); for(i=0;i<1000000;i++) sin(i); i=5; printf("I exit with %d/n",i); exit(i); } while(((child=wait(&status))==-1)&(errno==EINTR)); if(child==-1) printf("Wait Error:%s/n",strerror(errno)); else if(!status) printf("Child %ld terminated normally return status is zero/n", child); else if(WIFEXITED(status)) printf("Child %ld terminated normally return status is %d/n", child,WEXITSTATUS(status)); else if(WIFSIGNALED(status)) printf("Child %ld terminated due to signal %d znot caught/n", child,WTERMSIG(status)); return 0; }