Linux安装apue.3e以及运行第一个例子报错undefined reference to 'err_quit'
安装apue.3e
- 下载编译要用到的源代码,Advanced Programming in the UNIX® Environment, Third Edition source code。
- 随便解压到哪个目录里,
tar -zxv -f src.3e.tar.gz -C /your/direct/
,会在/your/direct/
目录下生成一个新目录apue.3e
,然后cd到这个apue.3e
里(若解压时报错不能创建目录,应该是你这个目录在一些关键位置导致,请用sudo
) - 执行
make
,若编译过程中报错can't find -lbsd
,请安装sudo apt-get install libbsd-dev
,再make。假设你make成功后。 cp ./include/apue.h /usr/include/
,让程序可以include。cp ./lib/libapue.a /usr/local/lib/
,让编译需要动态链接时,可以找到链接库。至此,环境变量配置完毕。(库文件叫libapue.a,去掉前缀后缀,这个库名字实际是apue)
系统:Ubuntu 16.04 LTS (amd64)
1-3 myls.c例子
#include "apue.h"
#include <dirent.h>
int main(int argc, char *argv[]){
DIR *dp;
struct dirent *dirp;
if(argc != 2)
err_quit("usage: ls directory_name");
if((dp = opendir(argv[1])) == NULL)
err_sys("cant open %s", argv[1]);
while ((dirp = readdir(dp)) != NULL)
printf("%s\n",dirp->d_name);
closedir(dp);
exit(0);
}
在你写好程序的目录中执行CC myls.c
或者gcc myls.c
报错undefined reference to err_quit
。因为你没有为编译指定要链接到的库文件,而gcc找不到实体。
执行gcc myls.c -o myls -l apue
即可解决问题。-l
参数指定你要链接的库名。