APUE编译问题解答

记得刚毕业时那会儿才知道APUE的鼎鼎大名,那时由于工作环境并非基于Linux/Unix,仅凭自己兴趣,零零散散地看了APUE其中的一小部分。现在决定重新认真地看APUE,当然主要是看自己感兴趣的章节。(APUE:Advanced Programming in the UNIX Environment 一本经典的Unix/Linux编程书籍)

今天,简单地编译了一下线程(thread)这一章中的一个例子,遇到一些编译和链接的问题,这里解释和记录一下。

源代码请点击:threadid.c

编译和运行时,时可能遇到的现象为(这是我在Ubuntu10.04上面进行的):

对上面的编译和链接的各种错误(包括警告),一一解释如下:
1. threadid.c:1:18: error: apue.h: No such file or directory
---现象说明:这是没有找到apue.h这个头文件
---解决方法:在GCC编译时,用-I参数添加头文件apue.h所在的目录,如:-I ../include
2. threadid.c:14: warning: incompatible implicit declaration of built-in function ‘printf’
---现象说明:这个warning是由于没有引入这个投文件导致的。
---解决方法:可以直接引入头文件#include ;不过在这里,引入apue.h后,就自然没问题了,因为apue.h中include了stdio.h了的。
3. threadid.c:(.text+0x8a): undefined reference to pthread_create'
---现象说明:这是由于GCC默认没有把pthread作为标准库去链接。
---解决方法:添加pthread为编译时的链接库,-l pthread
4. threadid.c:(.text+0xaf): undefined reference to
err_quit'
---现象说明:'err_quit'没找到,没定义,这是由于这个err_quit是APUE作者自己定义的
---解决方法:编译时,添加../lib/error.c文件(其中定义了err_quit等函数)
---另,GCC默认会链接的标准库为libc(e.g. /usr/lib/libc.a , /lib/libc-2.11.1.so)
解决了这几个编译和链接时的错误后,最终的编译命令为:
gcc threadid.c ../lib/error.c -I ../include -o threadid -lpthread

接下来就是运行这个编译好了的二进制文件(threadid)。
从上面可以贴出的运行情况可以看出,主线程和新的子线程的执行顺序不是固定的,在两次执行中,就分别出现了主线程和新线程先执行的情况。
这样也刚好证明了,在多线程程序中,线程调度执行的顺序是不确定的事情

master

Stay hungry, stay foolish.

发表评论

邮箱地址不会被公开。 必填项已用*标注

*