1

我想知道如何而不是跑步

gcc -std=c99 foo.c -o foo -lcs50

我可以跑

make foo

问题是当我只用make它说的命令尝试它时

cc     foo.c   -o foo
Undefined symbols for architecture x86_64:
  "_GetString", referenced from:
      _main in crypto-6PNyQP.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [crypto] Error 1

但是当我在使用命令时包含其他标志时,gcc它工作得很好。我正在上在线课程,他们只需输入即可make foo,他们的输出将是

jharvard@appliance (~/Desktop): make foo
gcc -ggdb -std=c99 -Wall -Werror    foo.c  -lcrypt -lcs50 -lm -o foo
jharvard@appliance (~/Desktop):

我已经在谷歌搜索了一段时间,试图找到这个问题的答案,但仍然没有运气。

4

2 回答 2

2

使用 GNU make

make CFLAGS=-std=c99 LDLIBS=-lcs50 foo

或将这些宏放入 2 行makefile

CFLAGS = -std=c99
LDLIBS = -lcs50

对于您在上一个示例中显示的更复杂的选项:

CFLAGS = -ggdb -std=c99 -Wall -Werror
LDLIBS = -lcrypt -lcs50 -lm

通过makefile这样的方式,您可以使用以下xyz代码从单个源文件构建任何程序xyz.c

make xyz

当您需要从多个源文件创建程序时,您将需要一个更复杂的makefile.

于 2012-10-20T22:34:24.100 回答
0

有一个讨论板(可通过 google 群组加入)专门回答与 CS50 设备配置有关的问题,这是我假设您正在运行的问题,因为您正在在线学习哈佛的 CS50。

CS50 in a Box(设备)应配置为当您键入 make 时,“正确”的事情会发生在最初的几个家庭作业中,这样您就不必立即担心编译的细节。

但是,如果它似乎不起作用,您可以向我上面提到的小组“cs50-discuss”发布一个问题。如果您(不明智地)使用自己的设置而不是设备,则可以简单地搜索如何制作“Makefile”,即运行程序“make”时读取的文本文件。拥有 Makefile 将允许您确保在调用“make”时正确调用要运行的命令。

于 2012-10-20T22:28:37.330 回答