如何使用make构建CS50程序

时间:2019-03-11 17:38:10

标签: c makefile gnu-make cs50

我正在尝试在linux上研究cs50,我下载了在github上找到的所有内容,但是现在我无法使用make编译我的第一个程序,但是我可以使用clang代替clang hello.c -lcs50 -o hello,它可以正常工作,但是当我尝试使用make hello进行编译

:~/cs50/pset1# make hello
cc     hello.c   -o hello
/usr/bin/ld: /tmp/cczILfhu.o: in function 'main':
hello.c:(.text+0x1a): undefined reference to 'get_string'
collect2: error: ld returned 1 exit status
make: *** [<builtin>: hello] Error 1

我什至将我下载的libcs​​50文件夹移到了/ usr / include / 但我仍然得到相同的结果。 在我用clang编译,然后执行make hello之后,它说 make:“ hello”是最新的。 我知道听起来有些垃圾,但我仍然是新手,正在寻求帮助。 预先感谢。

1 个答案:

答案 0 :(得分:2)

要在cs50库中进行链接(您应该根据那里的说明从https://github.com/cs50/libcs50安装它),链接命令应指定-lcs50参数。

make通常需要Makefile来控制构建。在没有它的情况下,它可以使用一些隐式规则来猜测构建过程,例如可以从hello.o构建hello.c,可以从hello链接hello.o,依此类推,但肯定不能猜到libcs50应该被链接。

幸运的是,隐式链接规则正确地包含了变量LDLIBS的内容,因此您可以通过在同一目录中编写一个简单的Makefile来解决此问题,其中仅包含

LDLIBS += -lcs50

即“将字符串-lcs50附加到LDLIBS的当前值”。

之后,make hello将使用隐式规则执行新的LDLIBS

cc     hello.c  -lcs50 -o hello

还要注意,cc命令通常是GCC,而不是Clang,在CS50中应该无关紧要。可以使用CC中的Makefile变量进行配置:

CC := clang

最后,在 compilation 标志中启用警告和警告提示是有意义的,例如:

CFLAGS += -Wall -Wextra -Werror -pedantic -std=c11

在这三个条件都存在的情况下,make hello实际上会执行

clang -Wall -Wextra -Werror -pedantic -std=c11    hello.c  -lcs50 -o hello

这意味着我们确实节省了大量键入内容,并获得了更多有用的诊断信息!


当然,对于更复杂的构建过程,您需要编写具有依赖性规则的更复杂的Makefile-说说您的helloworld程序是否由hello.c和{{1}组成}链接在一起,您可以通过隐式规则获得,只需声明world.c取决于 helloworld hello.o ,并且应该这些链接在一起:

world.o