解决Unix环境高级编程示例中的 undefined reference to `err_quit'
2013-04-18 20:44
561 查看
在编译APUE书中的例子(Page 290, 程序清单11-1 打印线程ID)时,出现如题所述错误,使用的编译命令为
$gcc -o print_thread_id print_thread_id.c -lpthread
这个错误的意思是在链接程序时,发现
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)
$gcc -o print_thread_id print_thread_id.c -lpthread
#include "apue.h" #include <pthread.h> pthread_t ntid; void printids(const char *s) { pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid, (unsigned int)tid, (unsigned int)tid); } void *thr_func(void *arg) { printids("new thread: "); return ((void *)0); } int main(void) { int err; err = pthread_create(&ntid, NULL, thr_func, NULL); if (err != 0) err_quit("can't create thread: %s\n", strerror(err)); printids("main thread:"); sleep(1); exit(0); }
这个错误的意思是在链接程序时,发现
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)
相关文章推荐
- 解决Unix环境高级编程示例中的 undefined reference to `err_quit'
- UNIX环境高级编程中的11章程序11-2编译问题---undefined reference to `pthread_create'
- unix环境高级编程-undefined reference to 'pthread_create'问题解决
- JNI编程-- undefined reference to `__android_log_print' 的解决办法
- Linux c++ error: undefined reference to 'dlopen' 解决办法
- 移植Qt-4.8.5出现undefined reference to '__sync_sub_and_fetch_4'解决方法--转载
- ubuntu中undefined reference to `__stack_chk_fail_local\'问题怎么解决
- ubuntu 下没有pthread库以及报undefined reference to 'pthread_create'的解决方法
- undefined reference to 'pthread_create'问题解决
- Linux下运行多线程——undefined reference to 'pthread_create'问题两种解决方法
- undefined reference to 'pthread_create'问题解决
- undefined reference to `__android_log_print'解决
- undefined reference to 'pthread_create' 问题解决[转]
- xcom.c:(.text.startup+0x24): undefined reference to `pthread_create'的解决方法
- undefined reference to 'pthread_create'问题解决
- 解决 linux下使用eclipse调用gdal 出现undefined reference to `GDALAllRegister'问题
- Linux 编译报错 -- undefined reference to 问题解决方法 (具体'pthread_create'和opencv看文章最后两条)
- undefined reference to 'pthread_create'问题解决
- undefined reference to 'pthread_create'问题解决
- linux下出现undefined reference to `mysql_init' 的解决方法