精华内容
下载资源
问答
  • 编辑编译链接
    • 编辑:编写后缀名为.c的源代码
    • 编译:计算机将.c文件翻译成后缀名为.obj的目标文件(在计算机底层执行)
    • 链接:将目标文件和库文件生成可执行文件,可执行文件的名称不是.c文件的名字,而是包含.c文件的项目名称(这一过程在计算机底层执行)
    • 运行:执行.exe文件,得到运行结果

    1

    什么是编译

    • 有了C源文件,通过编译器将其编译成obj文件(目标文件)
    • 如果程序没有错误,没有任何提示,但在Debug目录下会出现obj文件,该文件称为目标文件

    什么是链接

    • 有了目标文件(.obj文件),通过链接程序将其和运行需要的C库文件链接成.exe文件(可执行文件)
    • 如果程序没有错误,没有任何提示,就会在Debug目录下出现一个项目名.exe文件,称为可执行文件
    • 为什么需要链接库文件呢?因为我们的C程序中会使用C程序库的内容,比如<stdio.h><stdlib.h>中的函数printf(),system()等等,这些函数不是程序员自己写的,而是C程序库中提供的,因此需要链接
    • 链接后,生成的.exe文件比.obj文件大了很多。

    注意事项

    对修改后的.c文件需要重新编译链接,生成新的.exe文件后,再执行,才能生效。
    如果只想得到.exe文件而不在控制台显示,则选择“重新生成解决方案”
    1

    在这里插入图片描述

    展开全文
  • C++编辑编译链接运行

    千次阅读 2018-04-17 09:20:22
    ”到完成一个大型程序,当程序从编辑完成到执行成功都会经过5个步骤,分别是预处理(Prepressing)、编译(Compilation)、汇编(Assembly)、链接(Linking)和执行(Executing)。了解这五个过程中所做的工作,对...

    从写一个简单的“hello world!”到完成一个大型程序,当程序从编辑完成到执行成功都会经过5个步骤,分别是预处理(Prepressing)、编译(Compilation)、汇编(Assembly)、链接(Linking)和执行(Executing)。了解这五个过程中所做的工作,对我们理解头文件、库文件等在程序中的作用是有帮助的,而且如果能够清楚的了解编译链接过程,在编程时定位错误,纠正错误,以及编程时手动调整编译器以通过调试有很大帮助。

     

    1.     预处理

          预处理器,进行预处理。预处理过程主要处理那些源代码文件以“#”开始的预编译指令。比如“#include”、“#define”和条件预编译指令,如“#if”、“#ifdef”等。预处理时,将所有的“#define”删除,展开所有的宏定义,并且替换掉“#include”。

    (1)宏定义指令,如#define a b。对于这种伪指令,预编译所要做的是将程序中的所有a用b替换,还有#undef,则将取消对某个宏的定义,使以后该串的出现不再被替换。

    (2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉。

    (3) 头文件包含指令,如#include"FileName"或者#include<FileName>等。两者的区别是:系统提供的头文件包含用尖括号,系统直接去系统目录查找文件;自己写的用双引号,系统从工程目录中查找,如果没有再去系统目录查找文件。在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。采用头文件的目的主要是为了使某些定义可以供多个不同的源程序使用。因为在需要用到这些定义的源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。

    预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同,经过预编译后产生完整的源文件,将此文件作为编译程序的输入而被翻译成为机器指令。

     

    2.     对源程序进行编译

    经过预编译得到的输出文件中,只有常量;如数字、字符串、变量的定义,以及C语言的关键字等。编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析以及优化后产生相应的汇编代码文件,这个过程是整个程序构建的核心部分,也是最复杂的部分之一。为了使计算机能执行高级语言源程序,必须先用一种称为“编译器(complier)”的软件(也称编译程序或编译系统)。编译是以源程序文件为单位单别编译的,头文件不参加编译。(在VC6.0里如果编译头文件则会弹出没有可以工具函数,在VS2013中,对于头文件,编译按钮为灰色,不可用状态。)

    现在编译器种类很多,不同编译器区别在于对编译过程做了优化,添加了一些库函数或类库。优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有很大的关系。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的。对于前一种优化,主要的工作是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播,以及无用赋值的删除,等等。后一种类型的优化同机器的硬件结构密切相关,最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外,如何根据机器硬件执行指令的特点(如流水线、RISCCISCVLIW)而对指令进行一些调整使目标代码比较短,执行的效率比较高,也是一个重要的研究课题。

    编译技巧:编译的作用是对源程序进行词法检查、语法检查和中间代码生成。编译时对文件中的全部内容进行检查,如果有语法错误,编译结束后会显示出所有的编译出错信息,开发人员可以根据错误提示修改程序。对于新写的一个保护多个文件的工程,一开始采用源文件分别编译,这样容易发现每个源文件的自身错误,限定了错误的范围,如果一开始就采用全部编译,多个源文件可能会产生许多错误,无形中增加了开发难度。如果每个源文件都通过了编译,再将所有文件进行编译。对源文件分别编译对于调试,纠错是一种很好的方法。

     

    3.     汇编

    汇编实际上指把汇编语言代码翻译成目标机器指令的过程。汇编器的编译过程相对于编译器来讲比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译。对于被翻译系统处理的每一个语言源程序,都将最终经过这一处理而得到相应的目标文件。目标程序一般以.obj或.o作为后缀,这具体看操作系统,如Windows是下是.obj目标文件,Linux下是.o目标文件。目标文件中所存放的也就是与源程序等效的目标机器语言代码。


    有时候我们也将预编译、编译和汇编统称为编译。

     

    4.     将目标文件连接

    前面提到过,编译是对源文件分别进行的,每个源文件都产生一个目标文件。但由汇编程序生成的目标文件并不能立即就被执行,因为各个源文件之间可能是有相互联系的,例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题都需要经链接解决,即将源程序产生的多个目标文件链接为一个整体。即通过系统提供的“连接程序(linker)”将一个程序的所有目标程序和系统的库文件以及系统提供的其他信息连接起来,最终形成一个可执行的二进制文件,它的后缀是.exe,此时产生了完整的执行文件。

    链接程序的主要工作就是将有关的目标文件彼此相连接,如源文件产生的目标文件和库文件等,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。根据指定的库函数的不同,链接处理可分为两种:

    (1)静态链接:在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。

    (2)动态链接:此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。

    对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。 

    链接将相关关联文件链接起来,所以这个阶段的错误不好调试,发生错误可能在我们自己编写的代码中,也有可能是与别的文件关联产生的,对于因关联产生错误就比较复杂了,有时需要调整编译器或链接器。

     

    5.     运行程序

    运行阶段就比较简单了,直接执行前面链接过程产生的可执行的二进制文件(.exe文件)即可得到运行结果。通过对运行结果的分析,检验设计的程序是否满足期望和要求。如果运行结果不正确,应检查程序或算法,重新编辑代码。

            上述全过程可用下图表示:


     

     

    参考文献:

    http://blog.chinaunix.net/uid-26548237-id-3839979.html

    http://zhidao.baidu.com/link?url=tP_9JBtYigC_L3awSSYD4pwayXyXZU72dBoYDgy_0H-cuIVBQXCLnXf4FCZIzAVT81Hw8wpJUzEVBIEaTMfTYa

    http://blog.csdn.net/pangguanzhe1314/article/details/8609560

     

     

    展开全文
  • 编译链接

    2017-12-01 20:21:47
    欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 ...

    编译和链接

    • 当程序员之间在讨论创建程序之时,他们经常会说,“编译好了”或者,当问起他们程序是是否工作时,“让我们编译看看”。这些术语或许就是新手程序员的困惑之源。编译并不意味着创建了一个可执行文件!相反,创建一个可执行的文件是一个多阶段的过程,分为两个部分:编译链接。在现实中,即使一个程序“编译成功”也不意味着它能实际运行,因为有可能在链接阶段发生了错误。从源代码到可执行文件的整个过程更应该被称作构建(Build)

    编译

    • 编译指代处理源代码文件(.c,.cc,or .cpp)和创建“对象(object)”文件。这一步创建的文件是无法被用户直接运行的。相反,编译器仅仅产生对应于编译的源代码文件的机器语言指令。举个例子,如果你编译(但不链接)三个独立的文件,你会得到三个对象文件作为输出,每一个都有名称 filename.o或者filename.obj(扩展名取决于你所使用的编译器)。每一个文件都包含从源代码到机器码的转换–但你现在还不能运行他们!你需要把它们变成你操作系统可以运行的可执行文件。这就是链接器发挥作用的地方。

    链接

    • 链接指代从多个对象文件到单个可执行文件的创建过程。在这一个步中,一般链接器都会对未定义的函数发出警告(通常来说,是main本身)。在编译过程中,如果编译器没能发现特定函数的定义,它(编译器)就会假定这个函数在其他文件中。如果情况不是这样,那么编译器也没办法知道(这个未定义的函数到底在哪)–因为编译器只能在同一时间浏览一个文件内的内容。但链接器却可以查看多个文件(对象文件)并尝试查找出未定义函数的引用。
    • 你或许会疑惑为什么将程序构建过程分为编译和链接两部分。答案是:首先,这样的方法更容易实现。编译器做它该做的事,链接器做它该做的事–保持功能间的独立,使程序的复杂度得以降低。另一方面(更明显)的优点就是,一个非常大的程序中一个文件改变了,不需要重新编译整个程序,只需要编译改变的那个文件就行了。相反,使用所谓的”条件编译”,只需要编译哪些已经改变的源文件;其余的,对象文件是链接器足够的输入。最后,这使得实现预编译代码的库文件变得简单:仅仅创建对象文件然后将它和其余的对象文件链接起来。(顺便说一句,每个文件的编译与其他文件中的信息无关的编译过程,被称为“单独编译模型”)。
    • 为了获得条件编译的全部好处,让程序来帮助你比试图记住自上次编译以来更改过的文件可能更容易。(当然,您可以重新编译每个文件的时间戳大于相应的目标文件的时间戳。)如果你在集成开发环境(IDE)下工作,IDE会帮你处理好这一切。如果你使用命令行工作,那么有一个叫做make的漂亮使用的工具可以帮助你(大多数*nix发行版都会提供)。使用条件编译,还有几个对编程来说非常好的特性,比方说允许你程序有不同的编译结果–举个例子,你可以拥有一个可调试和输出大量相关调试信息的版本。
    • 了解了编译过程和链接过程后就可以更容易的捕获到bugs了。编译错误往往是语法上的–缺失了一个分号啊,多了一个括号啊。链接错误往往来自于未定义或多重定义。如果你从编译器得到了一条函数或变量多次定义的错误,那么这就很好的说明了这个错误是因为在你的源代码文件中重复定义了一个变量或函数造成的。
    展开全文
  • 先上一张图吧,完美表示出了,一个编辑好的程序变成可运行文件经过的过程(可以把编译和汇编统称为编译)。 一、预处理(预编译编译预处理) 主要处理源代码文件中的以“#”开头的预编译指令 1.删除所有的#define...

    先上一张图吧,完美表示出了,一个编辑好的程序变成可运行文件经过的过程(可以把编译和汇编统称为编译)。
    在这里插入图片描述
    一、预处理(预编译、编译预处理)
    主要处理源代码文件中的以“#”开头的预编译指令

    1.删除所有的#define,展开所有的宏定义。
    2.处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
    3.处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
    4.删除所有的注释,“//”和“/**/”。
    5.保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。
    6.添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。

    C语言中源代码文件的文件扩展名为.c,头文件的文件扩展名为.h,经预编译之后,生成xxx.i文件。
    在C++,源代码文件的扩展名是.cpp或.cxx,头文件的文件扩展名为.hpp,经预编译之后,生成xxx.ii文件。

    二、编译
    把预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法分析、语法分析、语义分析及优化后,生成相应的汇编代码文件(语法查错)。

    编译期仅仅知道内存分配的位置和大小,不做具体的分配操作

    三、汇编
    将汇编代码转变成机器可以执行的指令(机器码文件.o文件或者.obj文件)(Windows下为.obj,Linux或Uinux下为.o,没有本质区别,都是二进制文件)

    四、链接
    链接是指从多个对象文件创建单个可执行文件(将所有的.o及一些动态链接库文件(.exe .dll等)整合到一块)
    地址和空间的分配、符号决议(也叫“符号绑定”,倾向于动态链接)和重定位
    最终生成可执行的.out文件或者.exe文件

    展开全文
  • 上篇的链接在这里:函数,从编辑编译 (上) --带你了解预编译做了什么 下面继续: 2. 编译 所谓编译过程,就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生产相应的汇编代码文件。这一步是...
  • 在vim编辑状态(i)下输入这段代码 ESC退出插入模式 :wq 保存并退出   2、查看进程 pstree sw@ubuntu:~$ pstree pstree可以查看系统中进程关系 3、也可以用ps命令查看进程号 ...
  • c语言编译链接

    2017-04-06 16:53:04
    学过C语言的人都应该知道,我们所编辑的C语言程序是不能直接放到机器上运行的,它只不过是一个带".c"后缀的文件(也称为源代码)而已...我们将对C语言的这种处理过程称为编译链接编译就是把文本形式源代码
  • Delphi编译/链接过程

    2014-12-29 18:32:00
    首先,Object Pascal编译器把项目单元编译为二进制对象文件,然后资源编辑器将把诸如程序图标、窗体文件等资源编译成二进制资源文件,接着链接开始起作用;链接器根据编译器产生的二进制文件...
  • linux学习之编译-链接

    2019-06-02 21:53:00
    在Windows下使用习惯了IDE,导致我们对程序的编译链接没有一个清晰的认识,甚至混淆了编辑器和编译器的概念。在学习Linux时,这些问题就暴露出来了。 实际上,我们应该严格区分一个程序从产生到执行的整个过程:写...
  • c语言编译链接过程

    2018-08-22 17:52:50
    我们将对C语言的这种处理过程称为编译链接编译就是把文本形式源代码翻译为机器语言形式的目标文件过程。 链接是把目标文件、操作系统的启动代码和用到的库文件进行组织最终形成可执行代码的过程。编译链接...
  • 转自:http://www.pinlue.com/article/2020/12/2109/2911433730056.html
  • 文件的编译链接过程

    2019-07-30 19:40:31
    今天在这里总结一下文件的编译链接过程。 首先看一下编译链接的定义。所谓编译,就是把高级编程语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序会把人们所熟悉的高级编程语言换成机器可以识别的2...
  • gcc 编译静态链接

    千次阅读 2012-10-23 19:55:43
    静态链接库(static library)是目标文件(.o文件或.obj文件)的集合,后缀为.a 在编译使用时,静态库会被拷贝到可执行...本文对gcc编辑静态链接库演示一个示例,供参考,好记星不如烂笔头。 1. 编写代码 编写he
  • ELF_编译_链接

    2019-05-04 15:41:00
    它是软件按照一定格式输出的文件,就比如MP3文件也是音乐编辑软件输出的文件一样,gcc(这里所指不只包括编译器,是包含链接器,汇编器等在内的生成可执行程序所用工具的代称)会利用BFD库(Linux下提供的binutil工具包...
  • 20130311 编译链接 内存

    2014-03-11 21:38:00
    1、程序从编辑、预处理、编译链接、装入内存、执行 编辑——在开发工具里写程序 预处理——加载一些头文件、宏替换编译——将.c或者.cpp文件转化为目标文件(.o)链接——将所有的.o及一些动态链接库文件(.exe.dll...
  • 相对路径编译动态链接库欢迎使用Markdown编辑器 欢迎使用Markdown编辑器 在学习CMake的过程中在想要编译相对路径的动态链接库时碰到了一大堆问题,特此记录下来。 第一步是编译出动态链接库.so文件,这一步并不困难...
  • 编译是将程序员编辑的代码段中的符号地址转换为目标文件中的逻辑地址,这么说有点逆序,正因为生成了目标我文件,因此才将便于人管理的符号空间,转成了便于计算机识别的逻辑空间. 链接是将编译好的目标文件中加入库文件...
  • 由多个源文件组成的C程序,经过编辑、预处理、编译链接等阶段会生成最终的可执行程序。下面哪个阶段可以发现被调用的函数未定义? A.预处理 B.编译 C.链接 D.执行 2.分析 (1)预处理只会处理#开头的...
  • 1,Object Pascal编译器把项目单元编译为二进制对象文件(*.dcu),然后资源编辑器将把诸如程序图标、窗体文件等资源编译成二进制资源文件(*res,*.dfm). 2,接着链接开始起作用;链接器根据编译器产生的二进制文件,依...
  • 编译链接的知识

    2013-03-11 16:01:21
      转载自 graphchen 最终编辑 ...linux下编译hello.c 程序,使用gcc hello.c,然后./a.out就可以运行;在这个简单的命令后面隐藏了许多复杂的过程,这个过程包括了下面的步骤 宏定义
  • 我们将对C语言的这种处理过程称为编译链接编译就是把文本形式源代码翻译为机器语言形式的目标文件过程。 链接是把目标文件、操作系统的启动代码和用到的库文件进行组织最终形成可执行代码的过程。编译链接...
  • Linux下常用的命令还有文本编辑命令,Linux下常用的文本编辑器有vim编辑器,vim编辑器可以说是所有Linux新手刚上手就接触到的一款编辑器,其功能也是非常强大的,我们先来看一下vim文本编辑器的一些使用: ...
  • 可以用文本编辑器编程后改后缀名为.asm即可,此处我保存为t1.asm 0x02.编译 这一步打开DOS需要cd 到DOS的masm目录,路径信息在DOS窗口可以看到 0x03.链接 把.obj文件link生成.exe文件 0x04.运行并跟踪 debug命令...
  • 包含输入函数的源文件,在Devc中可以执行编译,在sublime text环境中编译会出现弹窗,显示无法找到文件入口,且无法定位程序输入点__gxx_personality_v0于动态链接库。 解决方法: 动态链接库问题由DLL文件导致。 ...
  • 需要把Linux下的C/C++代码移植到iOS平台下,iOS APP链接编译的静态库和动态库进行测试。 工具准备:      mac一台      cmake      xcode github上有一个iOS版的Cmake编译工具链:ios-cmake 基于该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,140
精华内容 856
关键字:

编译编辑链接