gcc编译和gcc -lm -Wall -o之间的区别?

时间:2014-09-14 04:01:41

标签: c gcc

我正在为我的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)

将程序输入第二次编译时会导致程序崩溃的原因是什么?

2 个答案:

答案 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>的原因。)