《UNIX 环境高级编程》学习记录 - 1.4 文件和目录

基本概念总结

文件系统

  • / 开始的路径为绝对路径
  • 不以 / 开头的路径为相对路径

文件名

  • 关于文件命名:在 UNIX 中只有斜线 / (本身是路径分隔符)和空字符不能出现在文件名中。也就是说,其它任何字符都可以使用!!这个感觉上去有点危险的。

工作目录

每个进程都有一个工作目录。所有相对路径名都是从工作目录开始解释

关于 myls.c 在 MacOS Big Sur 11.6 上的编译

拿到书本附送的源代码并不能直接在 MacOS 上编译成功,会缺少 apue.h 文件,这个文件可以在源代码中找到,解决这个问题之后,还会出现类似下面的错误 (myls.c 位于 chap1目录下)。详细的问题分析和讲解请参考 https://titanwolf.org/Network/Articles/Article?AID=be1b0c01-0a7c-4e44-b670-1a501458e2c7

➜ chap1 gcc myls.c
Undefined symbols for architecture x86_64:
"_err_quit", referenced from:
_main in myls-1e5557.o
"_err_sys", referenced from:
_main in myls-1e5557.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

解决办法

由于源代码中也引用到了错误处理的相关函数 err_exit err_sys(),而这两个函数存在于书本源代码 lib 目录下 的 error.cerrorlog.c中。所以解决思路就是拿到这两个文件并编译成静态库文件,然后在编译 myls.c 的时候链接到。

  1. error.cerrorlog.c 复制到与自己的 myls.c 文件父目录同级别的 lib
  2. 编译文件并生成两个 .o 文件
gcc -c error.c
gcc -c errorlog.c
  1. 由于在 MacOs 上用 ar 打包静态库文件时会出错,所以这里使用 MacOS 上的 libtool 工具完成,这个工具要求事先安装好 xcode
libtool -o liberror.a error.o errorlog.o
  1. 编译 myls.c 文件
gcc -L../lib -lerror myls.c``
  1. 执行编译出的可执行文件
➜  chap1 ./a.out $HOME
posted @ 2021-10-29 23:51  大卫高  阅读(47)  评论(0编辑  收藏  举报