g++ 编译选项

news2025/1/15 21:04:07

1,基本编译过程

 

g++可以用于编译C++代码生成可执行程序,从原始代码到生成可执行过程中实际经历了以下4个步骤:

1. 预处理:宏替换,注释消除,查找相关库文件等[使用-E参数]。

# 只激活预处理,不会自动生成.i文件,如果需要可以通过>重定向生成hello.i。
g++ -E hello.cpp > hello.i

2,编译:将预处理后的文件转换成汇编语言,生成.s汇编文件[使用-S参数]。

# 两种方式:
# cpp源文件直接经过预处理,编译生成.s汇编文件
g++ -S hello.cpp
 
# 将预处理生成的.i文件编译生成.s汇编文件
g++ -S hello.i

3,汇编:将汇编文件转换为目标文件(机器代码),即.o文件[使用-c参数]。

# 生成hello.o文件,以下几种都可以。
g++ -c hello.cpp # 实际执行了预处理,编译,汇编
g++ -c hello.i   # 实际执行了编译,汇编
g++ -c hello.s   # 实际执行了汇编

4,链接:链接相关目标文件或动静态库等,生成可执行文件[使用-o参数]。

# -o用于指定可执行文件名
g++ hello.cpp # 默认生成a.out可执行文件,一步到位
g++ hello.cpp -o hello #生成可执行文件,指定文件名为hello。
g++ hello.o -o hello #基于hello.o目标文件生成可执行文件。

2. 静态/动态库

当存在多个头文件和源文件时,需要先把每个文件都生成.o目标文件,最后链接成可执行。但是在一个大型的项目中,存在大量的文件,靠这种方式编译效率会非常低下,甚至出错,于是我们可以把一些有关联的模块打包成一个文件来使用,即库文件。下面举例说明:

假设某工程目录如下:

# include目录,存放.h头文件,假设有class1.h,class2.h
# src目录,存放.cpp源文件,假设有class1.cpp,class2.cpp
# test目录,存放主程序,假设有main.cpp
# 1.先生成.o再链接
g++ -c src/class1.cpp src/class2.cpp test/main.cpp -I include/
g++ src/class1.o src/class2.o test/main.o -I include/ -o main
 
# 2.直接编译
g++ src/class1.cpp src/class2.cpp test/main.cpp -I include/ -o main

-I 用于指明头文件的路径,不加会提示找不到头文件。

其实,生成库文件是更常用的方式,这里讲一下静态库动态库的生成。

1.1 静态库

静态库是指编译链接时,就已经把库文件的实现代码加入到可执行文件中,生成的可执行文件体积较大,但是好处就是在运行时就不需要再依赖库文件。

在linux下,静态库命名一般为libxxx.a,其中xxx表示该库的名称。

# 1.编译生成.o文件
g++ -c class1.cpp class2.cpp -I include
# 2.使用ar命令创建.a动态库文件
ar crv libmyclass.a class1.o class2.o -I include
 
# 使用静态库(链接)
g++ test/main.cpp -lmyclass -L. -static -o main -I include # 或者
g++ test/main.cpp libmyclass.a -o main -I include
 
# 可以使用该命令查看.a文件内容
nm -s libmyclass.a
 

 2.2 动态库

动态库与静态库相反,在编译链接时没有直接加入到可执行文件,而是在运行时链接文件加载库,可以节省系统开销,在项目中也方便版本迭代。

 在linux下,动态库的名字一般为libxxx.so,其中xxx表示该库的名称。

# 编译动态库
g++ class1.cpp class2.cpp -fPIC -shared -o libmypen.so -I include
 
# 使用动态库(链接)
g++ test/main.cpp libmypen.so -I include -o main # 直接使用.so的绝对路径
g++ test/main.cpp -L. -lmypen -I include -o main
 
# 测试可执行是否正确链接到库
ldd main

-shared:该选项指定生成的库为动态链接库。

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

动态链接后的程序,在运行时需要配合动态库一起使用,如果找不到动态库,会报错。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/633696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)-附代码

集成正态云和动态扰动的哈里斯鹰优化算法(IHHO) 文章目录 集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)1.哈里斯鹰优化算法2.改进哈里斯鹰优化算法2.1 正态云模型2.2 随机反向学习思想2.3 动态扰动策略 3.实验结果4.参考文献5.Matlab代码6.python代码 摘要: 针对基…

Uni-app学习从0到1开发一个app——(3)简单小工程内容介绍

文章目录 工程文件 看看一个标准的hello微信小程序工程文件的组成和作用。 工程文件 可以参考官方教程:传送门 之前的文章有详细的开发环境介绍,传送门Uni-app学习从0到1开发一个app——(2)windowns环境搭配,这里我们先建一个简单的示例微信…

【工具】Xshell-7和Xftp-7下载安装使用教程

目录 一、Xshell和Xftp 二、安装包下载(Xshell和Xftp) 三、Xshell安装、使用和常用设置 1. Xshell安装: 2. Xshell使用: 3. Xshell常用设置 三、Xftp安装、使用 1. Xftp安装 2. Xftp使用 一、Xshell和Xftp Xshell: Xshell是一款强大的SSH&#xff…

【数据结构与算法分析】树上漫步之探究前序、中序、后序、广度优先遍历算法的实现与优化

文章目录 前言二叉树的遍历方式构建二叉树递归遍历二叉树非递归遍历二叉树层次遍历 示例二叉树结果总结 前言 二叉树是数据结构中最基本的数据结构之一,它在计算机科学中有着非常重要的应用。二叉树的遍历是指按照一定的顺序遍历二叉树中的所有节点,是二…

DML——数据库查询语言

查询——select SELECT [DISTINCT/ALL/] {*|column|expression [alias],…} FROM table [Natuarl join /] where子句; Natuarl join 自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元祖队。 列名(属性名)完成相同值相同去除重复列拓展&…

【Typora+Lsky】在deepin使用YGXB-net/lsky-upload上传图片

本文首发于 慕雪的寒舍 在win和deepin上使用lsky-upload上传图片 1.说明 先前使用lsky图床的时候,我一直用的是picgo的插件来上传图片。 但最近picgo总是遇到卡上传的问题 https://github.com/Molunerfinn/PicGo/issues/1060 后来在gitee上面搜到了这个项目&…

Django实现接口自动化平台(七)数据库设计

上一章: Django实现接口自动化平台(六)httprunner(2.x)基本使用【持续更新中】_做测试的喵酱的博客-CSDN博客 下一章: 一、数据库设计 接口自动化平台,内置引擎,使用的是httprun…

【LeetCode热题100】打卡19天:最大数组和跳跃游戏

文章目录 【LeetCode热题100】打卡第19天:最大数组和&跳跃游戏⛅前言 最大数组和🔒题目🔑题解 跳跃游戏🔒题目🔑题解 【LeetCode热题100】打卡第19天:最大数组和&跳跃游戏 ⛅前言 大家好&#xff…

A股市场全景分析系列—从每日涨停个股分析热门板块与题材

前言‍‍ 当前市场股票多但资金有限,因此已经无法出现全面上涨的行情。这样一来识别当前的“风口”显得尤为重要,也就是上车热门板块、热门题材、强势个股! 因此聚焦分析涨停板个股显得尤为重要! 我们统计了近5个交易日…

【算法题解】38. 括号的生成

这是一道 中等难度 的题 https://leetcode.cn/problems/generate-parentheses/ 题目 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["…

DNS隧道穿透

介绍: DNS隧道,是隧道技术中的一种。当我们的HTTP、HTTPS这样的上层协议、正反向端口转发都失败的时候,可以尝试使用DNS隧道。DNS隧道很难防范,因为平时的业务也好,使用也罢,难免会用到DNS协议进行解析&am…

线上问题记录20230610-NGINX代理大文件下载问题

线上问题记录20230610-NGINX代理大文件下载问题 问题描述 我们有一个在线项目:是一个对象文件存储服务,是用来给用户提供文件对象存储的。今天用户在使用的时候发现超过1G的文件无法进行下载。幸好今天是星期六,使用的人并不是特别多&#…

华为OD机试真题 JavaScript 实现【最长的连续子序列】【2022Q4 100分】

一、题目描述 有N个正整数组成的一个序列,给定一个整数sum,求长度最长的的连续子序列使他们的和等于sum,返回该子序列的长度,如果没有满足要求的序列返回-1。 二、输入描述 第1行有N个正整数组成的一个序列。 第2行给定一个整…

【LIN通讯出现问题】

LIN信号发出了,但是没有收到响应的原因 如果你发送了LIN(局域网互连)信号,但没有收到响应,可能有以下几个原因: 线路故障:检查信号线路是否连接正确,可能存在接触不良、开路或短路等…

【PCB专题】Allegro 单线、差分线自动绕等长功能介绍

在文章【PCB专题】案例:绕等长怎么直接以颜色区分看出是否绕好 中我们讲到Allegro 16.6版本的Timing Vision功能可以直接在PCB上以颜色的区分就能看出单线和差分是否已经绕成等长了,不再需要到规则管理器中去查看。 那么其实Allegro还有单线自动绕等长的功能——Auto interac…

mac电脑储存内存越来越小如何清理释放空间?

如果你是一位Mac系统的用户,可能会发现你的电脑储存空间越来越小。虽然Mac系统设计得非常优秀,但是系统数据和垃圾文件也会占据大量的储存空间。在这篇文章中,我们将探讨mac系统数据怎么这么大,以及mac清理系统数据怎么清理。 一…

# Telegraph-Image:利用Cloudflare Pages和Telegraph无成本创建自己的图床

Telegraph-Image:利用Cloudflare Pages和Telegraph无成本创建自己的图床 Telegraph-Image是一个具有以下特点的图像托管服务: 特点: 无限图片储存数量:你可以上传不限数量的图片,没有存储限制。免费托管&#xff1a…

chatgpt赋能python:Python中如何删除字符串中的标点符号

Python中如何删除字符串中的标点符号 概述 在Python中,字符串是一种基本数据类型,经常被用来存储和处理文本数据。在处理文本数据时,我们常常需要删除其中的标点符号。本文将介绍如何使用Python中的字符串处理方法来删除字符串中的标点符号…

[安卓广播入门][1]Android Studio接收系统广播

一、新建项目 二、增加权限 <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" />三、代码 public class MainActivity extends AppCompatActivity {private IntentFilter intentFilter;//过滤隐式意图private NetworkChangeReceiver…

【状态估计】变分贝叶斯近似的递归噪声自适应卡尔曼滤波(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…