首页 > 编程语言 >C++编译 链接 执行那些事

C++编译 链接 执行那些事

时间:2024-09-15 18:21:03浏览次数:12  
标签:文件 函数 C++ 我们 编译 编译器 链接 log

OK! Right now!   Let's  go!

如何从源文件开始,实际的文本文档到可执行的二进制代码,写C++程序的基本流程。

实际是你有一些C++的源文件,然后将这些源文件给到编译器,编译器将其转成二进制的东西,二进制的东西可能是某种库,或者是可执行的程序。

在#符号之后的都是预处理语句,编译器收到源文件后,一看到这条语句,就先处理这些预处理语句(在实际编译发生之前就被处理了)

include的含义:他需要找到一个文件,在这个例子中,他需要找到iostream,然后将该文件所有内容,拷贝到现在的文件,这些所包含的文件被称为头文件。我们之所以要包含iostream这个头文件,是因为我们需要一个被调用的函数的声明。std::cout 可以让我们在终端打印东西。

main函数:任何一个C++程序都有一个main函数,他是程序的入口,意思是当我们运行程序时,计算机就从这个函数开始执行代码,当程序还在运行时,计算机会逐行执行我们的代码。当然,程序也可以中断或者改变执行的顺序,他们是控制语句或者函数调用。但最主要的还是一行一行的执行。因此,我们程序首选被执行的是

std::cout这句,然后是std::cin。运行完main中所有的东西后。我们的程序结束了。虽然她的返回值是int类型,但我们省略没写,是因为它默认返回0,这个只对main函数适用。

<<   叫做重载运算符 ,可以把他理解为一个函数,另一层含义是将字符串hello world推送的cout流中,然后打印到终端,然后推送一个行结束符endl,告诉终端调到下一行cin.get()函数是等待我们按下enter键,在前往下一句代码之前等待,这个时候程序暂时执行,直到我们按下回车键之后,程序继续运行下一行,但没有了,所以程序返回0,意味着代码执行结束 。

好了,我们现在写完了源代码文件main.cpp,我们怎么把它转换成可运行的二进制文件?

这有几个步骤,首先我们已经include <iostream>,这是预处理语句,编译器先处理这些语句 ,在这个例子中,编译器会将iostream文件内容全部包含进来,拷贝粘贴内容到代码文件中。

当预处理语句处理完了之后,我们的文件将被编译,这个阶段,编译器

将所有C++代码转化为实际机器代码,这里有些非常重要的设置决定我们怎么转化代码。

配置只是构建项目时候的一系列规则而已。

解决方案平台是指你编译的代码的目标平台,x86的意思就是目标平台是windows 32位,也就是说会生成32位的windows应用程序

debug模式会比release模式更慢,是因为优化都被关掉了,但是关掉的好处是我们可以调试代码

项目中的每个文件都会被 编译,但头文件不会被编译,仅仅是cpp文件中的头文件,原因是头文件的内容在预处理时已经包含进来了。

将要被编译的cpp文件,分别被编译器编译,每一个cpp文件都被编译成了一个object file(目标文件),如果我们用vs,生成的文件后缀是.obj,当我们有了这些生成的独立的obj文件后,我们需要把这些文件合并成一个执行文件。

轮到我们的朋友链接(link)出场了,基本上,链接的作用就是将所有的obj文件粘合在一起,将所有的obj文件合并成一个exe文件

当我们独立编译之后,链接还没发生,很明显我们编译单独一个文件,不会进行链接,编译器编译后都生成了.obj的目标文件,对于项目中的每一个C++文件,都会生成一个obj文件

这次我们构建整个项目,我们会看到生成了.exe文件,我们可以双击并打开它。

但如果是多个C++文件呢?假设我们仍然要打印Hello World,但我不想要用cout函数,我想用我自己的函数logging函数来包裹cout函数,因此我们建立一个函数,参数是message

我们将函数移动到另一个地方,然后我们对每个文件进行单独的编译,main.cpp文件并不知道还有个叫log的函数,因为不认识他,所以报错,我们可以通过调用声明来修复此错误,声明就像我们宣布有个东西叫log的函数是存在的,这就像是告诉编译器,这里有一个名叫log的函数,编译器只需要相信我们就好了,因为编译器并不关心这个函数是在哪定义的。

声明和定义:声明就是说这个符号、函数是存在的。  定义的意思是说这个函数到底是什么。

你或许会疑惑编译器是怎么知道log函数在另一个文件中,答案就是编译器知道,他相信我们

他怎么实际运行到正确的代码?这里就需要链接了 ,当我们构建整个工程时,不是单个文件,如果我们右键点击生成(build),我们所有的文件都会被编译。链接器会找到正确的log函数定义在哪里,将函数定义导入log函数声明中,让我们在main.cpp文件中调用。如果我们找不到log函数的定义,将会出现链接错误。

标签:文件,函数,C++,我们,编译,编译器,链接,log
From: https://blog.csdn.net/2401_87088772/article/details/142254019

相关文章

  • 「数组」堆排序 / 大根堆优化(C++)
    目录概述核心概念:堆堆结构数组存堆思路算法过程up()down()Code优化方案大根堆优化Code(pro)复杂度总结概述在「数组」快速排序/随机值优化|小区间插入优化(C++)中,我们介绍了三种基本排序中的冒泡排序与分治思想结合的算法:快速排序。本文我们来讲第二种基本排......
  • 详解c++多态---上
    virtual关键字1.可以修饰原函数,为了完成虚函数的重写,满足多态的条件之一。classPerson{public:virtualvoidBuyTicket(){cout<<"买票-全价"<<endl;}};classStudent:publicPerson{public:virtualvoidBuyTicket(){cout<<"买票-半价"<<......
  • 香橙派Zero3 全志H618设备树插件编译
    基本信息全志H618SDK:香橙派官方提供SDK虚拟机:Ubuntu22.04整体的SDK文件夹名称为:orangepi-build-nextSDK中Linux内核路径:orangepi-build-next/kernel/orange-pi-5.4-sun50iw9编译环境指定首先需要指定交叉编译器:在SDK中的toolchains文件夹中含有很多编译器:对于......
  • c++走出迷宫改良版2
    本文对上期做了删改话不多说上代码:注彩色输出部分代码出自博主夜若渊#include<bits/stdc++.h>#include<windows.h>#include<stdlib.h>#include<cstdio>#include<iostream>#include<string>#include<stdio.h>#include<ctime>#include<conio.h&g......
  • 深入解析C++函数指针:掌握游戏开发中的关键技术
    深入解析C++函数指针:掌握游戏开发中的关键技术C++作为一门经典的编程语言,因其强大的性能和灵活性,被广泛应用于游戏开发。而函数指针作为C++中的一个重要概念,在游戏开发中更是扮演着不可或缺的角色。对于想要深入掌握C++并在游戏开发领域站稳脚跟的开发者来说,理解并灵活运用函数指......
  • 在Ubuntu中编译含有JSON的文件出现报错
          在ubuntu中进行JSON相关学习的时候,我发现了一些小问题,决定与大家进行分享,减少踩坑时候出现不必要的时间耗费截取部分含有JSON部分的代码进行展示char*str=" { \"title\":\"JSONExample\", \"author\":{ \"name\":\"JohnDoe\&quo......
  • 帝国CMS提示“您来自的链接不存在”怎么解决?
    当帝国CMS提示“您来自的链接不存在”时,这通常意味着系统无法找到或识别你尝试访问的链接。这种情况可能由多种原因造成,以下是一些常见的解决方法:1.检查链接地址确认链接地址:首先确认你尝试访问的链接地址是否正确,包括拼写错误或格式问题。清除缓存:有时候浏览器缓存可能导致......
  • 漫话linux:基础IO,软硬链接,动静态库管理
    1.软硬链接    1.软链接:是一个独立文件,具有独立的inode,也有独立的数据块,它的数据块里面保存的是指向的文件的路径,公用inode        1.建立软连接ln-s目标文件或目录,链接名 目标文件或目录表示路径,链接名代表命令,无论在哪里输入命令就能调......
  • C++入门补充语法
    1、C和C++的区别                首先C++是包含C语言的,C语言中的所有语法在C++中都可以应用,因为C语言语法限制过多导致许多东西实现起来不方便,所以C++又制订了一系列的语法来补充C语言的不足。2、命名空间2.1命名空间为什么要使用命名空间,下面我们使用一段......
  • C++资源管理浅谈
    引言:            在计算机编程语言的学习与实践中,自然避免不了与计算机的资源管理打交道。所谓的资源就是,一旦用了它,将来就必须还给系统,如果用户不这么做,那糟糕的事情便会发生。在开始谈及C++的资源管理之前,先来聊聊何为计算机的资源,以及为何要管理计算机的资......