C++中的编译与链接

目录
  • 一、编译与链接模型
  • 二、编译与链接流程
  • 三、总结

​前言:

C++有个最大的特点,那便是编译型语言,相比于Python这种解释型语言,C++在编译阶段就进行了许多处理,在执行阶段便具有高效性,本篇主要讲解C++中的编译与链接;

一、编译与链接模型

1、一开始的C++是一个简单的加工模型,如下图所示:

这样会存在一些问题:

  • 无法处理大型程序
  • 加工耗时较长
  • 即使少量修改,也需要全部重新加工

2、为了解决以上问题,引入了分块处理的方式:

编译链接模型的好处:

  • 编译耗资源但一次处理输入较少
  • 链接输入较多但处理速度快
  • 便于程序修改(只需修改一部分)

在引入分块处理后,出现了一些常见概念:

①定义与声明:一个变量在只需在一个文件中定义,其他文件可通过声明该变量;

②头文件与源文件:由于声明的变量、函数过多,可将声明放在头文件中,在源文件中引用头文件加载这些声明;

③翻译单元:源文件 + 相关头文件(直接/间接)- 应忽略的预处理语句(宏定义不符合条件的);

二、编译与链接流程

下面通过一个实际例子,讲解程序如何从cpp一步步到可执行文件的;

下图为一个整体流程图:

1、预处理阶段:将cpp或c的源程序进行处理(头文件展开等),转换成以i结尾的翻译单元文件

g++ -E ./main.cpp -o ./main.i

2、编译阶段:生成编译后以s为后缀的汇编代码文件

g++ main.i -S -o main.s

3、汇编阶段:将汇编代码进行汇编生成以o为后缀目标文件

4、链接阶段:合并多个目标文件,关联声明与定义,生成可执行程序

以上为系统内部具体的实现操作,我们在实际运行中可以通过一行命令实现编译链接:

g++ ./main.cpp -o ./main

注意点:在用IDE编译程序时,往往会有两种模式:Debug和Release,Debug在开发中使用,优化较少,Release在最终程序编译使用,优化较多;

三、总结

  • C++的编译与链接过程是复杂的,预处理、编译与链接都可能出错,要细心排除;
  • 编译可能产生警告、错误,都要重视;
  • 我个人的感受,会遇到一些很奇怪的坑,不管从环境还是依赖库,这就需要有耐心不断尝试,并且总结经验;

到此这篇关于C++中的编译与链接的文章就介绍到这了,更多相关C++ 编译与链接内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C++编译器优化技术

    前言 注1:vc6.vs没有提供编译选项来关闭该优化,无论是debug还是release都会进行RVO和复制省略优化 注2:vc6.vs2005以下及vs2005+ Debug上不支持NRVO优化,vs2005+ Release支持NRVO优化 注3:g++支持这三种优化,并且可通过编译选项:-fno-elide-constructors来关闭优化 RVO #include <stdio.h> class A { public: A() { printf("%p construct\

  • 解析Linux下C++编译和链接

    编译原理 将如下最简单的C++程序(main.cpp)编译成可执行目标程序,实际上可以分为四个步骤:预处理.编译.汇编.链接,可以通过 g++ main.cpp –v看到详细的过程,不过现在编译器已经把预处理和编译过程合并. 预处理:g++ -E main.cpp -o main.ii,-E表示只进行预处理.预处理主要是处理各种宏展开:添加行号和文件标识符,为编译器产生调试信息提供便利:删除注释:保留编译器用到的编译器指令等. 编译:g++ -S main.ii –o main.s,-S表示只编

  • 深入理解C++内链接与外链接的意义

    上一篇博客给大家解释了"程序运行链接"的概念与意义,并区分了动态链接库与静态链接库.接下来想和大家谈一下C++的内链接与外链接的区别与意义.看完之后,希望你能理解以下几个问题~ 1.      为什么不要在头文件中定义具有外部链接的实体? 2.      在头文件中定义具有内部链接的实体有什么劣势? 3.      内部链接与外部链接存在的意义是什么? 首先理解什么是编译单元? 我们知道,其实编译器在编译代码时,只会去编译.cpp格式的源文件,并且预编译器会递归的把.cpp所有#inc

  • C++中的编译与链接

    目录 一.编译与链接模型 二.编译与链接流程 三.总结 ​前言: C++有个最大的特点,那便是编译型语言,相比于Python这种解释型语言,C++在编译阶段就进行了许多处理,在执行阶段便具有高效性,本篇主要讲解C++中的编译与链接: 一.编译与链接模型 1.一开始的C++是一个简单的加工模型,如下图所示: 这样会存在一些问题: 无法处理大型程序 加工耗时较长 即使少量修改,也需要全部重新加工 2.为了解决以上问题,引入了分块处理的方式: 编译链接模型的好处: 编译耗资源但一次处理输入较少 链接输

  • 解决pyqt中ui编译成窗体.py中文乱码的问题

    我在Eric工具下编译的 解决办法: 1.打开 C:\Python27\Lib\site-packages\eric4\i18n,将中文资源包的名称"GB2312."去掉,变成eric4_zh_CN.qm: 2. 启动 eric,找到"设置"-"参数设置"-"python"选项,将编码都设置为"utf-8",重启eric4. 以上就是小编为大家带来的解决pyqt中ui编译成窗体.py中文乱码的问题全部内容了

  • PHP批量获取网页中所有固定种子链接的方法

    本文实例讲述了PHP批量获取网页中所有固定种子链接的方法.分享给大家供大家参考,具体如下: 经常的下载链接比较多的时候,就像一次性将所有的链接添加到迅雷或者电炉,但是没有在这种选项,怎么办,咱是PHPer啊,这事儿难不到咱 且看代码,当然要换成你的,要根据具体情况来做修改. <?php header("content-type:text/html;charset=utf8"); $str = file_get_contents('./ShowFile.asp'); $str1 =

  • JSP中的编译指令和动作指令的两点区别

    JSP中的编译指令和动作指令的区别 1.编译指令是通知Servlet引擎的处理消息,而动作指令只是运行时的脚本动作 2.编译指令是在将JSP编译成Servlet时起作用,而动作指令可替换成JSP脚本,是JSP脚本标准化写法

  • Python爬虫获取整个站点中的所有外部链接代码示例

    收集所有外部链接的网站爬虫程序流程图 下例是爬取本站python绘制条形图方法代码详解的实例,大家可以参考下. 完整代码: #! /usr/bin/env python #coding=utf-8 import urllib2 from bs4 import BeautifulSoup import re import datetime import random pages=set() random.seed(datetime.datetime.now()) #Retrieves a list

  • 如何在Vue 3中扩展Vue Router链接详解

    前言 <router-link> 标签是一个很好的工具,可以在你的Vue应用程序的不同页面之间进行导航,但当导航到一个外部链接时,它不是一个工具,为此,你应该使用一个普通的<a> 标签.也许这只是我的问题,但很多时候,我都懒得去理会这其中的差别.其他时候,链接可能是动态的,也就是说,来自数据库或一些用户提供的数据源.在这种情况下,你根本不知道这个链接是外部的还是内部的,而且在每个可能使用这个链接的地方手动做V-if是多么痛苦的事情. 如果只是用一个单一的组件来处理所有的内部和外部链

  • Flex中给按钮添加链接点击链接打开网页的方法

    Flex中如何给一个按钮添加链接,点击链接打开一个网页呢? 可以用 navigateToURL 或者 htmlText 实现,请看下面的例子 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp()"

  • PHP实现把文本中的URL转换为链接的auolink()函数分享

    其实我在<把文本中的URL地址转换为可点击链接的JavaScript.PHP自定义函数>一文中介绍过PHP代码如何实现将URL地址转化成链接的方法,今天给大家介绍一个更加简洁的版本,先来看看PHP的源代码: auolink() API 复制代码 代码如下: /** * Author: SeeDZ * From: http://code.seebz.net/p/autolink-php/ **/ function autolink($str, $attributes = array()) {  

  • 在Python的Django框架中编写编译函数

    当遇到一个模板标签(template tag)时,模板解析器就会把标签包含的内容,以及模板解析器自己作为参数调用一个python函数. 这个函数负责返回一个和当前模板标签内容相对应的节点(Node)的实例. 例如,写一个显示当前日期的模板标签:{% current_time %}.该标签会根据参数指定的 strftime 格式(参见:http://www.djangoproject.com/r/python/strftime/)显示当前时间.首先确定标签的语法是个好主意. 在这个例子里,标签应该

随机推荐