《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.c
和 errorlog.c
中。所以解决思路就是拿到这两个文件并编译成静态库文件,然后在编译 myls.c 的时候链接到。
- 将
error.c
和errorlog.c
复制到与自己的myls.c
文件父目录同级别的lib
中 - 编译文件并生成两个 .o 文件
gcc -c error.c
gcc -c errorlog.c
- 由于在 MacOs 上用
ar
打包静态库文件时会出错,所以这里使用 MacOS 上的libtool
工具完成,这个工具要求事先安装好 xcode
libtool -o liberror.a error.o errorlog.o
- 编译
myls.c
文件
gcc -L../lib -lerror myls.c``
- 执行编译出的可执行文件
➜ chap1 ./a.out $HOME