CS61C-Proj1 微记录

CS61C-Proj1 微记录

问题

在编写好 imageloader.c、steganography.c、gameoflife.c 后,按理来说,此时运行以下代码就应该可以有合理输出

1
2
3
make imageloader
make steganography
make gameoflife
1
2
3
./imageloader testInputs/JohnConway.ppm
./steganography testInputs/JohnConway.ppm
./gameOfLife testInputs/blinkerH.ppm 0x1808

但是却在输入./imageloader testInputs/JohnConway.ppm后显示-bash: ./imageloader: No such file or directory,这显然是哪里出了问题。

解决

首先

确保环境配置无误后,我询问 Ai,采用了手动编译,即输入gcc -Wall -Wextra -std=c99 -o imageloader imageloadertester.c imageloader.c来代替make imageloader,之后正常输入

./imageloader testInputs/JohnConway.ppm
./steganography testInputs/JohnConway.ppm
./gameOfLife testInputs/blinkerH.ppm 0x1808

可以得到预期的结果,但是我想到 Makefile 可能存在问题,所以去问了 Ai 后发现 —— 确实。

最终的合理解决

** 方案 1:** 添加一个简单的 imageloader 目标

如果你想创建一个简单的 imageloader 可执行文件(类似于手动编译的命令),可以在 Makefile 中添加:

1
2
simple_imageloader: imageloadertester.c imageloader.c
$(CC) $(LDFLAGS) -o imageloader imageloadertester.c imageloader.c

然后运行:

1
2
make simple_imageloader
./imageloader testInputs/JohnConway.ppm

** 方案 2:** 修改现有的 imageloader 目标

修改现有的 imageloader 目标,使其创建名为 imageloader 的可执行文件:

1
2
3
4
5
6
imageloader: imageloader.o imageloadertester.o
$(CC) $(LDFLAGS) -o imageloader imageloader.o imageloadertester.o
echo "Running imageloadertest"
./imageloader testInputs/JohnConway.ppm > studentOutputs/JohnConway.ppm
diff testInputs/JohnConway.ppm studentOutputs/JohnConway.ppm
echo "Diff check: The above lines were different than expected. If no lines show up, then this passed"

** 方案 3:** 使用 imageloadertester

按照 Makefile 的设计,你应该使用 imageloadertester 而不是 imageloader:

1
2
make imageloader  # 这会创建 imageloadertester
./imageloadertester testInputs/JohnConway.ppm

为什么手动编译能工作?

手动编译命令:

1
gcc -Wall -Wextra -std=c99 -o imageloader imageloadertester.c imageloader.c

这个命令直接编译两个源文件并生成名为 imageloader 的可执行文件,绕过了 Makefile 的复杂规则。

看