CS61C-Proj1 微记录
CS61C-Proj1 微记录
问题
在编写好 imageloader.c、steganography.c、gameoflife.c 后,按理来说,此时运行以下代码就应该可以有合理输出
1 | make imageloader |
1 | ./imageloader testInputs/JohnConway.ppm |
但是却在输入./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 | simple_imageloader: imageloadertester.c imageloader.c |
然后运行:
1 | make simple_imageloader |
** 方案 2:** 修改现有的 imageloader 目标
修改现有的 imageloader 目标,使其创建名为 imageloader 的可执行文件:
1 | imageloader: imageloader.o imageloadertester.o |
** 方案 3:** 使用 imageloadertester
按照 Makefile 的设计,你应该使用 imageloadertester 而不是 imageloader:
1 | make imageloader # 这会创建 imageloadertester |
为什么手动编译能工作?
手动编译命令:
1 | gcc -Wall -Wextra -std=c99 -o imageloader imageloadertester.c imageloader.c |
这个命令直接编译两个源文件并生成名为 imageloader 的可执行文件,绕过了 Makefile 的复杂规则。