C++ 编译

2023-05-16

C++编译原理

参考博客:https://www.cnblogs.com/kevinWu7/p/10163443.html

C/C++ 编译就是要将C/C++ 的代码映射到相应的机器码,以及讨论其中的内存管理模式,包括内存的分配,如何使用等等。整型,数组,指针等这些在内存中的实现机制。

C/C++的编译包括几个部分,分别是预处理,编译,汇编和链接。
1.预处理 (预处理文件C为".i", C++为".ii")
主要处理#include 和 #define
把#include包含的.h插入到对应位置,把#define替换为实际的字符串
-E 可以让预处理后不再编译
gcc -E hello.c -o hello.i

2.编译阶段 (将预处理文件编译成".s"文件)
检查代码规范,语法错误,并将代码翻译成汇编语言。
-S 选项只进行编译而不进行汇编,生成汇编代码。
gcc -S hello.i -o hello.s

3.汇编阶段 (汇编生成".o"文件)
将编译文件翻译成二进制机器指令文件.o
-c 告诉gcc进行汇编处理
gcc -c hello.s -o hello.o

4.链接,形成相应的动态和静态链接库。生成可以执行文件)

静态链接库就是将程序所需的所有程序直接拷贝到程序中来
程序运行时将所需的动态链接库加载到内存

1.dll , obj , lib 使用在windows平台下
.dll: 动态链接库,作为共享函数库的可执行文件
.obj: 对象文件,相当于源代码对应的二进制文件,未经重定位
.lib: 可理解为多个obj的集合,本质与.obj相同

2 .so .o .a使用在linux 平台下
.so : (share object)动态链接库,跟Windows平台类似
.o : 对象文件,相当于源代码对应的二进制文件
.a : 与.o类似,多个.o集合

静态联编 与 动态联编

联编就是决定将函数的调用映射到哪一个函数的过程
例:

class A						class B        
{							{
	void func(){....}		void func(){....}
}							}
int main()
{		
	func();   //联编决定调用A.func 还是 B.func
}	

静态联编:
   是指联编工作是在程序编译连接阶段进行的,这种联编又称为早期联编;因为这种联编是在程序开始运行之前完成的;在程序编译阶段进行的这种联编又称静态束定;在编译时就解决了程序中的操作与执行该操作代码间的关系,确定这种关系又被称为束定;编译时束定又称为静态束定;
例:
#include <iostream>
using namespace std;

动态联编:
   编译程序在编译阶段并不能确切地知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,为此要确切地知道将要调用的函数,要求联编工作在程序运行时进行,这种在程序运行时进行的联编工作称为动态联编,或动态束定,又叫晚期联编;C++规定:动态联编是在虚函数的支持下实现的;

代码编译

  1. 动态库编译:
      g++ function.c -I ./ -fPIC -shared -o libfunction.so
         function.c 是我们要操作的目标源文件
         因为function.c中有#include “function.h”,所以我们要在用 g++ 编译时给出function.h文件的位置。在 g++ 命令中,用-I选项标识.h文件的位置,此处我们的function.h与function.c在同一路径下,因此用命令** -I ./,其中./**表示当前所在路径。
         -fPIC表示生成的是位置无关码(即使不加 fPIC 也可以生成 .so 文件,但是对于源文件有要求,例如因为不加 fPIC 编译的 so 必须要在加载到用户程序的地址空间时重定向所有表目,所以在它里面不能引用其它地方的代码)
         -shared表示生成的是动态库(共享库)
         -o用来指定输出文件的名字,-o libfunction.so表示生成文件名为libfunction.so

  2. 静态库
    (一系列对象文件的集合)
    g++ -c sayhello.cpp
    g++ -c say.cpp
    ar -r libsay.a sayhello.o say.o (该静态库包含sayhello.cpp,say.cpp两个cpp)
    程序 ar 配合参数 -r 创建一个新库 libsay.a 并将命令行中列出的对象文件插入
    采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。

    编译链接静态库
    第一种:
    通过指令 g++ -o main main.cpp libmix.a

    第二种:
    通过指令 g++ -o main main.cpp -L. -lmix
    其中-L. 是链接静态库的路径,在此路径为当前目录,语法为-Lpath
    -lmix 是静态库的名称标签,语法为-lxxx, 其中xxx省略了lib和.a后缀。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 编译 的相关文章

随机推荐

  • C++ struct与class的区别

    可以归纳为 xff1a struct A char a struct B A char b 1 struct作为数据结构实现体 xff0c 它的数据访问默认是Public公有的 xff0c class作为对象的实现体 xff0c 它的成员变
  • 蚁群算法实现三维避障轨迹规划(Matlab)

    关于蚁群算法 其实大多数优化算法都是 试错 的过程 xff0c 不同的是如何利用在 试错 过程中得到的经验 蚁群算法在 试错 的过程中通过留下信息素对未来的试错过程加以提示 xff0c 从而保证一定的收敛性 代码分析 我写了一份matlab
  • CAN总线基础知识(2)——CAN的数据帧

    CAN总线基础知识 xff08 2 xff09 CAN结构上由7个段组成 xff08 仲裁段包括上篇说的can id 和 RTR xff09 xff0c 如图所示 其中根据仲裁段ID码长度的不同 xff0c 分为标准帧 xff08 CAN2
  • 一种通过printf打印的调试程序的方法

    我们在写代码的时候 xff0c 有时候需要调试程序的时候 xff0c 对于初学者 xff0c 可以通过简单的增加printf函数打印 xff0c 这样能够来跟踪程序的踪迹 xff0c 举个很简单的代码 xff1a include lt st
  • 详解Unity中的Nav Mesh新特性|导航寻路系统 (二)

    前言 第一篇我们简要概述了新版NavMesh的一些新增功能 xff0c 以及旧版的对比 本篇我们来讲一讲NavMeshSurface NavMeshLink这两个组件的参数以及如何应用 xff0c 接下来就进入正题吧 本系列提要 Unity
  • ROS安装包--rqt

    ROS安装包 rqt 安装命令刷新缓存 安装命令 sudo apt get install ros kinetic rqt sudo apt get install ros kinetic rqt common plugins sudo a
  • 【无标题】

    ROS自定义话题传输出现md5sum错误 问题描述 提前从一个程序中使用rosbag record命令对某一话题进行了录制 xff0c 之后用rostopic echo命令确定了录入了信息 但是给另一程序发布的时候 xff0c 终端报错 x
  • 关于CAN标准帧和扩展帧为什么分别占位是11bit和29bit

    关于CAN标准帧和扩展帧为什么分别占位是11bit和29bit 文章目录 关于CAN标准帧和扩展帧为什么分别占位是11bit和29bit前言一 关于标准帧二 关于扩展帧总结写在结尾 前言 之前一直没明白CAN标准帧和扩展帧为什么分别占位是1
  • 旭日x3派个人配置总结(ubuntu server + xrdp)

    旭日x3派基本设置 旭日x3派使用文档 首发 多方位玩转旭日x3派 XRDP 43 Xface4远程桌面设置 安装xrdp并解决闪退 黑屏问题 ROS2 Foxy配置 解决 Failed to connect to raw githubus
  • 思岚S2激光雷达1—初次连接

    1 去官网下载Robostudio xff0c 我这里是windows http www slamtec com robostudio 2 连接激光雷达 3 去官网下载SDK 4 在SDK文件夹里的tools里面找驱动下载驱动 5 电脑成功
  • ZED2双目相机1:标定

    一 下载及安装 xff08 1 xff09 按照下面这个链接 xff1a https blog csdn net TengYun zhang article details 123072847 下载完是这样的 xff1a xff08 2 x
  • ZED2双目相机2:畸变矫正

    1 运行ZED2相机 xff08 注意是在ZED WS工作空间里 xff09 xff08 1 xff09 关闭anconda xff08 如果有的话 xff09 xff1a conda deactivate span class token
  • 用android代码实现一个可以万能播放器

    要实现一个万能播放器需要使用多媒体库 xff0c 可以使用Android自带的MediaPlayer类以及ExoPlayer库 以下是一个简单的示例代码 xff1a 在XML布局文件中添加一个SurfaceView和几个按钮 xff1a s
  • 初出茅庐的小李第108篇博客二进制打印

    二进制打印介绍 C语言在格式化打印的时候有很多格式控制 xff0c 比如十进制打印用 d输出 xff0c 十六进制用 x输出 xff0c 八进制用 o格式输出 xff0c 但是当我们期望看一个数据的二进制的时候就必须借助计算器或者其他比较不
  • QGroundControl 自定义命令小工具的使用

    Custom Command Widgets 不用编译qgc的源码 xff0c 仅仅需要编写一个QML UIs文件这个小工具窗口可以被加载 xff0c 并且从重启之后仍然可以使用 xff0c 而且不受操作系统的限制主要有两个用途 xff11
  • HTTP请求方式GET和POST代码示例

    HTTP请求方式GET和POST代码示例 1 HTTP名词解释1 2 HTTP传输方式1 2 1GET名词解释1 2 1POST名词解释 1 3Http中Post 和Get代码实现 1 HTTP名词解释 HTTP大名叫做超文本传输协议 xf
  • Postman工具常见操作

    Postman常见操作 1 新建GET或POST请求 xff08 1 xff09 打开Postman xff0c 选择File gt New xff08 2 xff09 选择Request xff0c 进入 xff08 3 xff09 输入
  • Ubuntu18.04+ROS melodic 跑通VINS-MONO的一些踩坑记录

    VINS MONO的一些踩坑记录 0 本机环境 笔者的环境为Ubuntu 18 04 43 ros melodic 43 opencv 4 1 1 43 Eigen 3 3 9 43 ceres solver 1 14 跟VINS MONO
  • GPIO库函数开发和寄存器开发的区别

    函数原型为 xff1a void GPIO SetBits GPIO TypeDef GPIOx uint16 t GPIO Pin xff08 1 xff09 gt 箭头操作符要求左操作数必须是个指针GPIO TypeDef GPIOx
  • C++ 编译

    C 43 43 编译原理 参考博客 https www cnblogs com kevinWu7 p 10163443 html C C 43 43 编译就是要将C C 43 43 的代码映射到相应的机器码 xff0c 以及讨论其中的内存管