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