首页 > 其他分享 >[CPP] CPP的编译链接过程

[CPP] CPP的编译链接过程

时间:2023-10-03 20:55:58浏览次数:43  
标签:int 编译 cpp CPP main 链接

手写的源代码本质上只是一串文本, 但是在编译器里点一下编译就可以直接看到程序的输出,从文本到执行输出之间发生了什么

 

源代码到可执行程序大致经历以下几个过程

                

1、 预编译(Preprocessing)

  预编译阶段主要做四件事: 头文件展开, 宏替换, 执行预编译指令, 移除代码中的注释

2、 编译(Compilation)

  编译阶段主要工作是将预编译生产的文件翻译为汇编语言文件

3、 汇编(Assemble)

  汇编阶段主要工作是将上一阶段的汇编文件编译为二进制的目标文件

4、 链接(Linking)

  链接阶段将通过链接程序将启动代码和库代码连同上一阶段的目标文件一起生成最终的可执行文件

 

以以下程序为例

 tool.h

#pragma once
int add(int a, int b)
{
	return a + b;
}

 main.cpp

#include <iostream>
#include "include/tool.h"

#define TEST 1

#ifdef TEST
#define B 2
#endif

int main()
{
	int a = 3;
  // calculate a plus B int sum = add(a, (int)B); std::cout << sum << std::endl; }

1、预编译 

执行以下指令可以得到预编译后的文件, 可以看到

  • 头文件tool.h被展开
  • 预编译指令和宏都已经被执行
  • 原有的注释被删掉
g++ -E main.cpp >> main.i

 

 2、编译

 接着执行以下命令得到汇编文件main.s

g++ -S main.cpp

 

3、 汇编

执行以下命令得到目标文件main.o(object file)

g++ -c main.cpp -o main.o

  

4、链接

g++ main.cpp -o main

  

标签:int,编译,cpp,CPP,main,链接
From: https://www.cnblogs.com/foresta/p/17741632.html

相关文章

  • 解决交叉编译产生的程序放到目标板上运行时出现Segmentation fault (core dumped)
    原文:https://blog.csdn.net/qq_36219010/article/details/100163134在PC机上编译一段程序:arm-linux-gnueabihf-gcc-ohellohello.c这里产生hello文件用FTP传输到目标板上(树莓派3B+),运行时出现:报告段错误。后来我又试了不输出指定的文件名:arm-linux-gnueabihf-gcchello.c......
  • dpdk 编译
     引用: https://zhuanlan.zhihu.com/p/56670068720.11版本 DPDK(DataPlaneDevelopmentKit)是数据平面开发工具包,由用于加速在各种CPU架构上运行的数据包处理的库组成。DPDK需要一定的网卡硬件支持,以Intel为例,支持以下网卡: 下面带大家过一遍编译流程,扫清后续应用的......
  • 链接 protobuf 就崩溃
    跟着官网的Demo试验了一下,发现跑起来就Abort了,下面是具体的报错terminatecalledafterthrowinganinstanceof'std::system_error'what():Unknownerror-1Aborted(coredumped)通过不停的删减代码和修改编译命令,定位到链接了protobuf就会崩溃。从GitHub搜索到......
  • CSS预编译:提升样式开发效率与可维护性的关键工具
    ......
  • 【TypeScript学习】—编译选项(三)
    【TypeScript学习】—编译选项(三)一、自动编译文件tscxxx.ts-w二、自动编译整个项目三、编译器选项......
  • cpp: read .dat file
     ///<summary>///打开DAT文件///</summary>voidoperatefile(){ chardata[100]; constchar*fname="afile.dat"; //打开文件. ofstreamoutfile; outfile.open(fname,ios::in); if(!outfile) { cout<<"文件不存在!"<......
  • Android 编译和使用libpng
    libpnglibpngistheofficialPNGreferencelibrary.ItsupportsalmostallPNGfeatures,isextensible,andhasbeenextensivelytestedforover28years.Thehomesitefordevelopmentversions(i.e.,maybebuggyorsubjecttochangeorincludeexperimen......
  • lapce源码学习-编译调试
    master分支调试1、报错:`#![feature]`maynotbeusedonthestablereleasechannel2、Channel切换到nightly,报错:thetraitbound`file_type::FileType:std::sealed::Sealed`isnotsatisfied3、Channel切换到beta,编译ok,但提示不能调试rustupinstallbeta4、编译成功后,......
  • 代码链接与实践截图
    include<fcntl.h>include<unistd.h>intmain(){intfile_desc=open("test.txt",O_RDONLY);if(file_desc<0){//错误处理}//进行其他操作...close(file_desc);return0;}include<fcntl.h>include<unistd.h>intmain(){c......
  • 点播模块编译nginx
    VOD模块NGINX编译部署主要解决我那破电视的观影需求、软件装不了又不想掏钱看线上广告;U盘也没法播、没几个兼容的解码软件,五六年前的电视买的是真坑爹,我又不会刷机,那索性用废笔记本装linux整个nginx-vod模块整个音视频链接,电视上用短小精悍的VLC观影。下包mkdir/usr/local/n......