我正在为我的CS课程完成一项家庭作业,我们需要为我们第一次使用C开发这个简单的程序。
我能够通过gcc编译创建程序,但在使用gcc -lm -Wall -o
编译时,我的程序崩溃并返回
Undefined symbols for architecture x86_64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
将程序输入第二次编译时会导致程序崩溃的原因是什么?
答案 0 :(得分:2)
要使用gcc编译代码,还需要传入源文件的名称。因此,如果您有一个名为project1.c
的源文件,则可以通过运行:
gcc -lm -Wall -o a.out project1.c
假设您的代码已成功编译(无错误),您可以通过执行以下操作来运行它:
./a.out
话虽如此,您的代码将无法编译。您不能对浮点数使用模数运算符。
foo.c:9:25: error: invalid operands to binary expression ('float' and 'float')
leftover= enrollment%25;
~~~~~~~~~~^~~
答案 1 :(得分:1)
要了解gcc
的命令行参数,可以使用
$ man gcc
文档非常令人生畏,因为有很多选项。手册页的一些经验将帮助您快速扫描所需的信息。
首先要看的是顶部的SYNOPSIS部分。这显示了gcc
的用法。 []
中的任何内容都是可选的。请注意,在本节的最后,有infile...
。这意味着您必须至少提供一个文件名供编译器处理。我怀疑你错了,因为你错过了这个。
所以正确的命令行应该是
$ gcc -Wall -o <program> <program>.c -lm
这会将您的.c
文件编译为具有相同名称但没有扩展名的可执行文件。
有关您正在使用的选项的详细信息,以下内容直接来自gcc
手册页。
-Wall
This enables all the warnings about constructions that some users
consider questionable, and that are easy to avoid (or modify to
prevent the warning), even in conjunction with macros.
-llibrary
-l library
Search the library named library when linking.
-o file
Write output to file.
您获得的错误归因于-Wall
选项。
名为&#34; m&#34;的库中的-lm
标志链接。这是一个数学图书馆,你现在可能不需要担心。有关此库的更多详细信息,请使用man libm
。
请注意-o
选项需要参数。在您的情况下,这会告诉gcc
要创建的可执行文件的名称。 (这是我在上面建议的解决方案中-o <program>
的原因。)