记得刚毕业时那会儿才知道APUE的鼎鼎大名,那时由于工作环境并非基于Linux/Unix,仅凭自己兴趣,零零散散地看了APUE其中的一小部分。现在决定重新认真地看APUE,当然主要是看自己感兴趣的章节。(APUE:Advanced Programming in the UNIX Environment 一本经典的Unix/Linux编程书籍)
今天,简单地编译了一下线程(thread)这一章中的一个例子,遇到一些编译和链接的问题,这里解释和记录一下。
源代码请点击:threadid.c
编译和运行时,时可能遇到的现象为(这是我在Ubuntu10.04上面进行的):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
master@jay-intel:~/apue.2e/threads$ gcc threadid.c -o threadid threadid.c:1:18: error: apue.h: No such file or directory threadid.c: In function ‘printids’: threadid.c:14: warning: incompatible implicit declaration of built-in function ‘printf’ threadid.c: In function ‘main’: threadid.c:35: warning: incompatible implicit declaration of built-in function ‘exit’ master@jay-intel:~/apue.2e/threads$ gcc threadid.c -I ../include -o threadid /tmp/cc8KrW2F.o: In function `main': threadid.c:(.text+0x8a): undefined reference to `pthread_create' threadid.c:(.text+0xaf): undefined reference to `err_quit' collect2: ld returned 1 exit status master@jay-intel:~/apue.2e/threads$ gcc threadid.c -I ../include -o threadid -lpthread /tmp/ccnwUK6O.o: In function `main': threadid.c:(.text+0xaf): undefined reference to `err_quit' collect2: ld returned 1 exit status master@jay-intel:~/apue.2e/threads$ gcc threadid.c ../lib/error.c -I ../include -o threadid -lpthread master@jay-intel:~/apue.2e/threads$ master@jay-intel:~/apue.2e/threads$ ./threadid new thread: pid 4935 tid 813848320 (0x30825700) main thread: pid 4935 tid 821823232 (0x30fc0700) master@jay-intel:~/apue.2e/threads$ ./threadid main thread: pid 4937 tid 2604488448 (0x9b3d5700) new thread: pid 4937 tid 2596513536 (0x9ac3a700) |
对上面的编译和链接的各种错误(包括警告),一一解释如下:
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
3. threadid.c:(.text+0x8a): undefined reference to pthread_create'
err_quit'
---现象说明:这是由于GCC默认没有把pthread作为标准库去链接。
---解决方法:添加pthread为编译时的链接库,-l pthread
4. threadid.c:(.text+0xaf): undefined reference to
---现象说明:'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)。
从上面可以贴出的运行情况可以看出,主线程和新的子线程的执行顺序不是固定的,在两次执行中,就分别出现了主线程和新线程先执行的情况。
这样也刚好证明了,在多线程程序中,线程调度执行的顺序是不确定的事情。