博主的环境:
- VMave centos7 环境
- win10 ubuntu20.04STL 子系统
我会在上面这两个环境中搭建,在不同的点会告知,没有对比,说明操作相同。 - 建议从头看到尾,在centos7的提到的,可能在ubuntu中不再赘述。
代码获取
第三版代码链接 http://csapp.cs.cmu.edu/3e/code.html
选择上面红色方框下载 tar
开始搭建(centos7)
-
把包放在你喜欢的地方,这里我放在了Desktop
-
输入
tar -xf code-all.tar
解压
-
进入到 code 目录里
sudo cp include/csapp.h /usr/include/ sudo cp lib/libcsapp64.a /usr/lib sudo cp lib/libcsapp64.a /usr/lib64
输入上面3条指令,将库文件移到 /usr/include 和 /usr/lib 中,压缩包里提供的是64位的,如果需要32位的,请看下面win10 子系统Ubuntu(下面统称Ubuntu,不一样和真实Ubuntu环境一样,我没有实验过)的编译,注意这里Ubuntu子系统不能直接按照上面这样,但VMave里的Ubuntu可不可以我不知道,读者可以自行尝试,不行的话参照下面子系统因为编译需要多加一个 -fPIC参数,看后文。
-
出现下面这样就说明已经,搭建 csapp.h 这个文件的环境成功
注意,这里用 gcc 编译时要加上 lcsapp64 和 lpthread 因为是静态库,什么是静态库参照《CSAPP 3e》第7章第二节。
csapp64 是你刚才移到库文件里的 libcsapp64.a,如果不喜欢这个名字可以改成 libcsapp.a(或者其它什么的,要保留前面的 lib),以后编译就可以直接指定 lcsapp 而不用加上64。
开始 win10 Ubuntu 20.04STL 子系统
-
再次提醒。注意这里Ubuntu子系统不能直接按照上面这样,但VMave里的Ubuntu可不可以我不知道。
-
这次进入 code/src 目录,并用
make clean
把压缩包中预先编译好的 *.o 全部删除掉。因为它编译出来的不符合本系统要求。读者可以按照centos7试试有什么问题。
-
vim 打开 Makefile 文件,添加一个下面的黄色参数
上面这个参数会在编译的时候加入到 gcc 中 -
然后退出 vim ,输入
-
make cpe64.o csapp64.o fcyc64.o lsquare64.o clock64.o
-
重新进行编译
-
接着输入
make ../lib/libcsapp64.a
链接产生一个libcsapp64.a 的静态库
-
在win10 ubuntu的lib目标不太一样,有一些我们需要改一下路径
sudo cp include/csapp.h /usr/include/ 这个照常不变
-
进入到下面这个目录(你不一定是这个目录,可以用cd从/usr慢慢走到这个目录)
-
然后输入下面
sudo cp /home/binwatson/code/lib/libcsapp64.a .
同样向上面输出 a.out就说明成功了。
编译32位的libcsapp.a 和 写一个shell脚步
-
在 src 中的Makefile,提高了对32位的编译的支持,我们可以把上面make代码的后缀64,全部改成32的就可以编译32位的。
-
每次编译都需要 -lpthread 和 -lcsapp64 这个后缀参数,太麻烦了。下面写一个脚步方便,后面编译代码。
#!/usr/bin/bash # 本脚步将 compiler 后接的第一个参的文件名,作为编译后的 # 可执行文件名 #PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin #export PATH CFLAGS="-O1 -Wall" ARG="-lcsapp64 -lpthread" filename=${1%.*} # 截取出文件的名,去掉后缀 例如 fork.c --> fork allFile="" length=$# i=$# # echo ${i} while [ ${i} -gt 0 ] do i=$((${i}-1)) # echo ${i} allFile=${allFile}" "${1} # echo $allFile shift done # echo ${filename} # echo ${allFile} # echo ${ARG} gcc ${CFLAGS} -o ${filename} ${allFile} ${ARG}
binwatson@LinZhenBin:~/code$ sh compiler.sh fork.c
binwatson@LinZhenBin:~/code$ ls
0 a.out asm compiler.h conc data error fork.c include io link netp perf vm
Makefile arch c.sh compiler.sh copy.c ecf fork getasmfun.pl intro lib mem opt src
binwatson@LinZhenBin:~/code$