2012-10-07 31 views
4

我正在学习C与GCC编译器和Geany(Arch Linux,如果它有所不同)。但是,我在Geany和互联网上看到了可交换使用的文字编译和构建。我要求澄清的是,我了解编译过程的方式是正确的,因为Google搜索只是让我更加困惑。需要澄清用于编译C文件的某些术语

说我写一个简单的helloworld.c文件:

#include <stdio.h> 
int main(void) 
{ 
    printf("Hello world!"); 
    return 0; 
} 

如果我运行gcc -c helloworld.c,编译器生成一个helloworld.o目标文件。 Geany把这个过程称为编译和编译器说Compilation finished successfully.

现在,如果我跑gcc -o helloworld helloworld.c,编译器生成名为helloworld可执行文件和Geany称之为建设。然而,编译器再次说Compilation finished successfully.

据我所知,-c选项产生一个目标文件,并且它们中的多个可以与库链接在一起产生一个可执行文件,但我很困惑哪些场景是编译和这是建设。

此外,如果我在项目中只有一个源文件,如单个helloworld.c文件,是否足以将源代码转换为可执行文件?

由于

回答

3

要回答你的第二个问题:是的,gcc -o myprog myprog.c就好了。所以gcc -o myprog *.cgcc -o myprog foo.c bar.c baz.c

回答你的第一个问题:从技术上说,没有单词是'building':)然而,'building'和'compiling'这两个词可以互换使用来描述从源代码生成最终可执行文件的整个过程。

在更精确的环境下,你会说有:

  • 预处理,当预处理程序包含头文件,扩展宏等。
  • 解析,其中解析器对源文本进行标记并生成程序流的结构化数据模型(所谓的抽象语法树)。
  • 编译或汇编,当码发生器遍历AST,并从它
  • 组装,当编译器驱动程序调用一个汇编程序,其转动组件文本到二进制对象代码和最后
  • 联或键生成汇编代码,当编译器驱动程序调用链接器查找库中的符号时,填写缺少的地址等。

因此,严格来说,只有第3个小步骤是编译;此外,使用GNU工具链和make,人们倾向于将前四个步骤(从.c源文件生成目标文件)编译为一个。

More on all this here...

+0

谢谢,这帮了很大的忙!也感谢关于使用gcc的提示,我不知道你可以提供多个源文件作为参数,将它们全部转换为单个可执行文件。 – james

2

编译通常被认为是如车削源代码转换为机器代码,但并不一定也连接机器代码以创建最终的可执行文件。构建是描述创建最终可执行文件的整个过程的更一般的术语。编译将涉及编译和链接。如果你没有使用-c选项,那么链接自动完成,所以这将被视为构建,但编译也是该过程的一部分。

虽然您可能会发现使用的术语有点松散。

0

编译程序时,编译器只检查文件是否有编译时错误(如语法和语义错误)。当您“编译”程序时,编译器会首先检查其中是否有任何错误,然后将源代码转换为机器代码(实际编译)并在此过程中创建可执行文件。

对于你的第二个问题,仅仅是gcc -o helloworld helloworld.c就足以“将源代码转换为可执行文件”。

+1

我觉得这是更好的使用*精确的术语*回答OP的问题 - 这正是他所期待的。另外,你错过了他的第二个问题。 – 2012-10-07 05:17:59