告别环境报错!手把手教你为《深入理解计算机系统》第三版(CSAPP 3e)在Ubuntu 20.04/WSL2下编译专属库

张开发
2026/4/19 5:17:06 15 分钟阅读

分享文章

告别环境报错!手把手教你为《深入理解计算机系统》第三版(CSAPP 3e)在Ubuntu 20.04/WSL2下编译专属库
告别环境报错手把手教你为《深入理解计算机系统》第三版CSAPP 3e在Ubuntu 20.04/WSL2下编译专属库最近在WSL2环境下学习《深入理解计算机系统》CSAPP时发现官方代码包直接编译总会报错。经过多次尝试终于找到了完美解决方案。本文将分享从环境准备到一键编译的全过程特别针对Ubuntu 20.04和WSL2环境优化。1. 环境准备与代码获取首先需要确认你的WSL2已经安装Ubuntu 20.04。打开终端输入以下命令检查版本lsb_release -a官方代码包可以从CMU官网获取wget http://csapp.cs.cmu.edu/3e/code.html -O code-all.tar解压代码包tar -xvf code-all.tar cd code注意WSL2与原生Linux在文件系统上有差异建议将代码放在/home/username/目录下避免权限问题。2. 解决WSL2特有编译问题WSL2环境下直接编译会报错主要原因是缺少-fPIC参数。这是WSL2与原生Linux的一个重要区别。修改src/Makefile文件找到CFLAGS行添加-fPIC参数CFLAGS -Wall -O1 -fPIC保存后执行清理并重新编译make clean make cpe64.o csapp64.o fcyc64.o lsquare64.o clock64.o make ../lib/libcsapp64.a3. 安装库文件到系统目录编译完成后需要将库文件和头文件安装到系统目录sudo cp include/csapp.h /usr/include/ sudo cp lib/libcsapp64.a /usr/lib/ sudo cp lib/libcsapp64.a /usr/lib64/验证安装是否成功ls /usr/include/csapp.h ls /usr/lib/libcsapp64.a4. 创建便捷编译脚本每次编译都需要指定库文件很麻烦可以创建一个编译脚本csapp-compile.sh#!/bin/bash # 检查参数 if [ $# -eq 0 ]; then echo Usage: $0 source_file.c exit 1 fi # 提取文件名不含扩展名 filename$(basename $1 .c) # 编译命令 gcc -Wall -O1 -o $filename $1 -lcsapp64 -lpthread # 检查是否编译成功 if [ $? -eq 0 ]; then echo 编译成功可执行文件: ./$filename else echo 编译失败 fi给脚本添加执行权限chmod x csapp-compile.sh使用示例./csapp-compile.sh fork.c5. 32位库编译可选如果需要编译32位版本修改Makefile中的后缀make cpe32.o csapp32.o fcyc32.o lsquare32.o clock32.o make ../lib/libcsapp32.a安装32位库sudo cp lib/libcsapp32.a /usr/lib/更新编译脚本添加对32位的支持#!/bin/bash # 默认使用64位库 LIBCSAPP-lcsapp64 # 检查是否要使用32位库 if [[ $* *-m32* ]]; then LIBCSAPP-lcsapp32 fi gcc -Wall -O1 -o ${1%.*} $1 $LIBCSAPP -lpthread6. 常见问题解决问题1编译时报错relocation R_X86_64_PC32 against symbol这是因为WSL2需要位置无关代码。确保已经添加了-fPIC参数。问题2找不到csapp.h头文件检查头文件是否安装正确sudo find / -name csapp.h如果不在标准目录编译时需要指定头文件路径gcc -I/path/to/csapp/include ...问题3链接时报错undefined reference to Sem_init确保链接了正确的库文件并且使用了-lpthread参数。7. 一键安装脚本为了简化整个过程可以创建一个完整的一键安装脚本install-csapp-lib.sh#!/bin/bash # 下载代码 echo 下载CSAPP代码包... wget http://csapp.cs.cmu.edu/3e/code.html -O code-all.tar # 解压 echo 解压代码包... tar -xvf code-all.tar cd code || exit # 修改Makefile echo 修改Makefile添加-fPIC参数... sed -i s/CFLAGS -Wall -O1/CFLAGS -Wall -O1 -fPIC/ src/Makefile # 编译64位库 echo 编译64位库... make clean make cpe64.o csapp64.o fcyc64.o lsquare64.o clock64.o make ../lib/libcsapp64.a # 安装库文件 echo 安装库文件到系统目录... sudo cp include/csapp.h /usr/include/ sudo cp lib/libcsapp64.a /usr/lib/ sudo cp lib/libcsapp64.a /usr/lib64/ # 创建编译脚本 echo 创建便捷编译脚本... cat csapp-compile.sh EOF #!/bin/bash gcc -Wall -O1 -o ${1%.*} $1 -lcsapp64 -lpthread EOF chmod x csapp-compile.sh echo CSAPP库安装完成 echo 使用./csapp-compile.sh file.c编译你的程序这个脚本会自动完成从下载到安装的全部过程。使用时只需chmod x install-csapp-lib.sh ./install-csapp-lib.sh在WSL2环境下使用CSAPP代码时最大的坑就是-fPIC参数问题。第一次遇到时花了不少时间排查后来发现这是WSL2特有的要求。现在每次在新环境配置时都会直接运行这个一键安装脚本省去了很多麻烦。

更多文章