解决Unix环境高级编程示例中的 undefined reference to `err_quit'

来源:互联网 发布:公共摄像头查看软件 编辑:程序博客网 时间:2024/05/20 00:36

在编译APUE书中的例子(Page 290, 程序清单11-1 打印线程ID)时,出现如题所述错误,使用的编译命令为

    $gcc -o print_thread_id print_thread_id.c -lpthread

[cpp] view plain copy
  1. #include "apue.h"  
  2. #include <pthread.h>  
  3.   
  4. pthread_t ntid;  
  5.   
  6. void printids(const char *s)  
  7. {  
  8.   pid_t pid;  
  9.   pthread_t tid;  
  10.   
  11.   pid = getpid();  
  12.   tid = pthread_self();  
  13.   printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid,  
  14.      (unsigned int)tid, (unsigned int)tid);  
  15. }  
  16.   
  17. void *thr_func(void *arg)  
  18. {  
  19.   printids("new thread: ");  
  20.   return ((void *)0);  
  21. }  
  22.   
  23. int main(void)  
  24. {  
  25.   int err;  
  26.   err = pthread_create(&ntid, NULL, thr_func, NULL);  
  27.   if (err != 0)  
  28.     err_quit("can't create thread: %s\n", strerror(err));  
  29.   
  30.   printids("main thread:");  
  31.   sleep(1);  
  32.   exit(0);  
  33. }  

    这个错误的意思是在链接程序时,发现 err_quit函数未定义。下面,详细介绍如何解决此问题


Linux环境下(以Ubuntu10.04为例)
1、下载src.tar.gz源代码的压缩包,并拷贝、解压至/home/user/目录下

      $cd /home/user/

      $ls

       src.tar.gz

      $tar -xvf src.tar.gz

      此时,/home/user/ 下应有 apue.2e的文件夹
2、修改 Make.defines.linux文件中的WKDIR=/home/xxx/apue.2e,改为
       WKDIR=/home/user/apue.2e
3、返回至apue.2e目录下面,修改该目录下所有的linux.mk(貌似子目录中有十几个这样的文件),将里面的nawk全部改为awk,可以使用这个命令 :%s/nawk/awk/g
      可能你的该目录(子目录)下的多个linux.mk不用修改,那么直接跳过这步
4、$make
      若此步骤时出现错误: 如 getenv1.c:4: error: ‘ARG_MAX’ undeclared here
      时,请: 
       编辑 apue.2e/include 目录下的apue.h,添加
       #define ARG_MAX 4096
       一行,然后在 apue.2e/threadctl 目录下的getenv1.c 和getenv3.c文件中添加
       #include "apue.h"
       一行
      至此,再make时,应该可以顺利编译.
5、将 /home/user/apue.2e/include/apue.h 和 /home/user/apue.2e/lib/error.c复制到/usr/include目录下

      (需要root权限)

      $cp  /home/user/apue.2e/include/apue.h  /home/user/apue.2e/lib/error.c  /usr/include
6、cd 到目录apue.2e/lib下

      $cd /home/user/apue.2e/lib

      $ranlib libapue.a
   然后拷贝这个.a文件到/usr/lib/apue目录下 (没有apue目录则新建一个)

      $mkdir -p /usr/lib/apue

      $cp /home/usr/apue.2e/lib/libapue.a /usr/lib/apue/
7、编译你的源文件,如 print_thread_id.c
    $ gcc -o print_thread_id print_thread_id.c -lpthread -L /usr/lib/apue -lapue

至此,可执行文件应该已经生成。使用./print_thread_id来执行它吧,效果如下:

main thread: pid 16808 tid 3076421312 (0xb75e76c0)
new thread:  pid 16808 tid 3076418416 (0xb75e6b70)
阅读全文
0 0
原创粉丝点击