c++代码的编译

2023-11-10

1.gcc和g++
    1.1搞清楚几个名字
        GCC :GNU Compiler Collection (GUN编译套件),可以编译c,c++,java,objective-c,Fortran等语言。
        gcc :GCC中的 GUN C Compiler(C 编译器)
        g++:GCC中的GUN C++ Compiler(C++编译器)
    
    1.2 编译过程
        .c—>.i—>.s—>.o—>可执行文件
        预处理: .c —>.i  (宏替换,去掉注释,引入头文件) gcc -E
        编译: .i—>.s  (生成汇编代码) gcc -S
        汇编: .s —>.o  (汇编代码转化为机器码) gcc -c
        链接:.o —> 可执行程序(调用链接器ld来链接目标文件生成可执行文件)
    
     1.3 gcc的调用过程    
       当在调用gcc时,并不是直接调用的c语言的编译器,实质上它根据要编译的文件是.c结尾还是.cpp结尾来确定使用c语言编译器还是c++编译器。在使用gcc和g++来编译c++文件时,gcc不能链接c++的一些库,所以编译c++时最好使用g++。 在编译阶段,g++会调用gcc。
 
2.动态链接库与静态链接库
    2.1 静态链接库
         中间文件在windows下为.obj,在linux下为.o,windows下. obj的集合就是.lib, linux下.o的集合就是.a
        .a或者.lib称为静态链接库,通过静态库编译出的程序一般都很大,而且静态库如果发生变化就要重新编译生成可执行程序,但是编译后不依赖外部文件就可以运行
        linux下 创建静态库:ar 
            ar的参数:
                r:插入模块到库中,如果库中存在该模块,替换
                s:写入一个目标文件到库中,或者更新该目标文件
                v:程序执行时显示详细信息
                t:显示打包文件中所包含的文件
                d: 删除
                q:添加
        ar  -rv   libmytest.a  test1.o  test2.o   
    2.2 动态链接库    
        .so或者.dll称为动态连接库,程序在执行到动态库中的函数才调用相应函数,编译的时候不会整和到可执行程序中,所以可执行程序一般比较小,并且如果动态库发生变化也不需要重新编译可执行程序,升级的时候方便,linux下动态库一般存放在 /lib, /usr/lib 和 /usr/local/lib下,但是程序运行的时候必须提供动态链接库支持。
        linux下创建动态库: -shared
            gcc  -fPIC  -c test1.c (- fPIC产生与位置无关的代码,使得.so文件能被多个程序使用
            gcc  -fPIC  -c test2.c 
            gcc  -shared  -o libmytest.so  test1.o  test2.o    
            上面三句话创建一个动态库mytest ,也可以用一句命令: gcc -fPIC -shared  -o libmytest.so  test1.c  test2.c
 
3.gcc编译的参数
    -E :预处理  gcc -E test.c -o test.i
    -S:编译 gcc -S test.i  -o test.s 
    -c:汇编 gcc -c test.s  -o test.o      
    -o: 不使用默认命名
    -g: 加入调试信息
    -w:不生成警告信息
    -Wall:生成警告信息
    -Idir:指定头文件目录,在使用#include的时候会首先在这里查找,查找不到再去默认的头文件目录查找  ,默认/usr/include   
    -I:取消前一个参数的功能,一般在 -Idir后面使用 
    -include file :引用其他文件,功能类似于#include<file>
        gcc -test.c -include /home/username/test/test.h
    -Ldir:指定库的搜索路径
    -llibrary:指定编译时使用的库   gcc -lmylib  test.c  使用mylib库编译程序,对应的库文件名为libmylib.so
            lib库名.so  =  库文件名        
            /lib,/usr/lib和/usr/local/lib里的库直接用-l参数就能链接,没在这三个地方时使用-L指定路径。
    
4.多个文件的编译
    多个文件需要编译时一般有两种方式,一是所有源文件一起编译,一是分别编译每个源文件,最后链接。前者需要将程序一次性编译,适合体量小的程序,分别编译的好处是某个文件改变时只需要编译改变的文件,不需要重新编译所有文件。
 
5.makefile文件
    对于文件很多,一个项目的情况下,可以把编译过程写在一个文件中,执行这个文件就可以一步一步编译,这个文件通常命名为makefile或者Makefile,在linux下make命令会执行名字为makefile或Makefile的文件,也可以使用其他命名如makefileHp,这个时候需要使用make -f  makefileHp命令来指定执行这个文件。
 

转载于:https://www.cnblogs.com/Zhangyq-yard/p/8623821.html

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

c++代码的编译 的相关文章

  • Vue-Cli的简单入门使用

    说明 这篇文章是为了让我和组里同学快速上手 学会使用Vue Cli的基本使用而写的 里面可能有许多错误 还请仔细识别 当然 欢迎指正 Vue Cli简单使用 说明 框架的创建 创建代码 安装时报错及解决办法 安装完毕后的构建操作 报错及解决
  • 必看五大安全趋势 Fortinet全球威胁态势报告发布

    全球领先的网络安全解决方案提供商Fortinet NASDAQ FTNT 于近日发布2021年下半年 全球威胁态势报告 据报告显示 当前全球网络攻击的自动化和攻击速度均显著提升 更具破坏性 不可预测性且更加持续的网络犯罪正快速演进 此外 伴
  • win10+使用cmake编译最新的ceres-solver库

    参考文献 点击这里访问 感谢大佬 说明 我这个只编译了release版本 如果还需要debug版本 cmake编译和vs编译都需要另外设置一些东西 我没有弄 文章目录 参考文献 说明 1 需要使用的库 2 需要的工具 3 准备工作 3 1
  • python学习笔记—— socket编程

    上篇 https blog csdn net qq 42489308 article details 89388112 socket编程 什么是socket 简称套接字 是进程间通信的一种方式 它与其他进程间通信的一个主要不同是 它能实现不
  • vue的组件化开发

    vue的组件化开发 组件 Component 是 Vue js 最强大的功能之一 组件可以扩展 HTML 元素 封装可重用的代码 官方文档 https cn vuejs org v2 guide components registratio
  • go context学习

    context学习 context的struct设计 type Context interface Deadline deadline time Time ok bool Done lt chan struct Err error Valu
  • shell_exec() has been disabled for security reasons错误怎么解决?

    ytkah在用composer安装插件时出现了shell exec has been disabled for security reasons错误提示 这个是php配置的问题 shell exec 函数被禁用了 怎么解决呢 shell e
  • 类外访问类的私有(保护)成员

    在C 中类外访问类的私有 private 或保护 protected 成员变量 有以下几种方法 1 通过在类中定义共有的成员函数 用成员函数去调用类的私有成员变量 在类外就可以实现对私有成员变量的访问 2 在类外实例化一个类的对象 定义一个
  • 安全仔的2023年暑期实习面试经历

    大二在校菜鸡 之前下定决心想在暑假去公司实习 投了几家 将面试经历发给大家 观安信息 岗位 渗透测试实习 一面 技术面 自我介绍 介绍大学怎么接触安全 有什么经历 网络攻防夏令营 ctf冬令营 有什么项目 SRC渗透测试挖掘 先问了项目的情
  • Valine 一款快速、简洁且高效的无后端评论系统

    Valine 一款快速 简洁且高效的无后端评论系统 简介 Valine 诞生于2017年8月7日 是一款基于LeanCloud的快速 简洁且高效的无后端评论系统 理论上支持但不限于静态博客 目前已有Hexo Jekyll Typecho H
  • 干货分享:SparkBench--Spark平台的基准性能测试

    SparkBench简介 SparkBench是Spark的基准性能测试项目 由来自IBM Watson研究中心的五位研究者 Min Li Jian Tan Yandong Wang Li Zhang Valentina Salapura
  • NoClassDefFoundError: Could not initialize class……

    一 背景 在做一次应用更新发布的时候 应用发布完成 但是请求访问的时候报了NoClassDefFoundError异常 出现了如下错误 二 问题猜测及分析 1 项目打包有问题或者打包不完整 导致缺少类文件 所以初始化加载失败 重新打包 并在
  • 【Espruino】NO.17 使用平板电脑调试Espruino(OTG方式)

    http blog csdn net qwert1213131 article details 38068379 本文属于个人理解 能力有限 纰漏在所难免 还望指正 小鱼有点电 Espruino中文社区 本节内容主要是讲如何用平板电脑调试E
  • 定义列表

    dl dt 槟榔 dt dd 湖南 海南产 dd dd 有提神作用 dd dd 吃多了不好 dd dd 有点贵 dd dl
  • JAVA 关键字介绍 strictfp

    JAVA虽然具有跨平台性 但是各个平台对浮点数的运算操作是不相同的 所以在不同平台上进行的浮点数操作所得到的结果可能不同 strictfp 强制规定各个平台上进行一套标准的浮点数操作 浮点规范IEEE 754 以降低性能为代价 当一个类被s
  • Latex中如何实现图并列/表并列/以及混合并列排版以及双列变单列

    一 图并列2 2排版 两外的1 2都可以参考下列代码 begin figure htbp centering begin minipage 0 49 linewidth 表示图片的占用那一列的宽度 centering vspace 0 6c
  • java8 32位和64位资源分享 Windows 版本:8u311

    阿里云盘 Java8u311 点击链接保存 或者复制本段内容 打开 阿里云盘 APP 无需下载极速在线查看 视频原画倍速播放 链接 https www aliyundrive com s RK8wK2m41bv 百度云盘 链接 https
  • 每个前端人都应该看看的Vue3开源项目

    从目前的一线面试经验来看 八股文跟吃饭一样已经麻了 而项目题 场景题才是面试官考察的重点和加分项 正好我之前整理过一份全网爆火且值得学习的前端实战资料 这里无偿分享出来以便大家突击提升技术 另外还有前端必备基础资料 可帮助大家实战 理论双重
  • LeetCode(Python)—— 最后一个单词的长度(简单)

    最后一个单词的长度 概述 给你一个字符串 s 由若干单词组成 单词前后用一些空格字符隔开 返回字符串中最后一个单词的长度 单词是指仅由字母组成 不包含任何空格字符的最大子字符串 输入 s Hello World 输出 5 输入 s fly
  • on project rocketmq-dashboard: Failed to run task: ‘yarn install’ failed. org.

    最新Windows环境下搭建RocketMQ及其控制台环境 1 搭建RocketMQ 1 1 下载RocketMQ 官网下载地址 https rocketmq apache org release notes 选择合适的版本下载Binary

随机推荐

  • 黄平书-线接触热弹流润滑 Fortran+Matlab转译代码

    原Fortran代码有错误 进行了修改 数值上差别不大 根据Fortran代码转的Matlab 可以完美运行 但是因为精度问题有差异 只能说趋势是一致的 需要私我 资源里只是Fortran运行结果
  • 2023华为OD机试真题【恢复数字序列】

    题目内容 对于一个连续正整数组成的序列 可以将其拼接成一个字符串 再将字符串里的部分字符打乱顺序 如序列8 9 10 11 12 拼接成的字符串为89101112 打乱一部分字符后得到90811211 原来的正整数10就被拆成了0和1 现给
  • 程序员Linux学到什么程度,Linux学到什么程度,才可以找到合适的工作?

    首先我说一下我的学习路线吧 我是学习java出生的 懂编程的人都知道 一般我们程序员用开发系统 大多数都是在linux系统上开发的 在最开始的时候把我哥给了我一本书 我名字就叫鸟哥的私房菜 这本书非常不错 非常适合刚入门的新手看学习 里面讲
  • python中定时执行脚本

    python中定时执行脚本 引入time os sched 这三个是必备的 import time os sched def ll num print 123123456 with open tt txt ab as txt txt wri
  • Spring Cloud Edgware新特性之九:Sleuth使用MQ方式整合Zipkin

    原文 http www itmuch com spring cloud edgware new sleuth zipkin mq 众所周知 Spring Cloud Sleuth有两种方式整合Zipkin HTTP直连Zipkin方式 MQ
  • 微众银行蝉联入选《福布斯》全球区块链50强

    美东时间2023年2月7日 福布斯 杂志公布2023年全球区块链50强榜单 微众银行蝉联入选 微众银行因联合多方共建开源联盟链生态圈 以及基于DDTP Distributed Data Transfer Protocol 分布式数据传输协议
  • 腾讯云存储上传头像、文件功能(超详细保姆级)

    创建腾讯云 并实名认证 地址 申请腾讯云账号 腾讯云 产业智变 云启未来 腾讯 在官网搜索对象存储 点击立即使用 创建存储桶 无脑下一步 唯一注意点就是可以选择共有读写 以及取一个存储桶的名称 查看存储桶列表 点击进某个存储桶后 可以上传文
  • 【Qt Quick】用Qt编辑器书写C++项目、解决输出中文问题

    系统 Win10 IDE Qt 1 简介 我想直接用qt的编辑器写c 的项目 不再重新下载vs2019等 2 创建项目 创建好以后 默认会有如下代码 include
  • JDK源码汇总

    JDK源码汇总 持续更新中 Appendable
  • 关于Android中的api、implementation、compile理解

    1 compile在3 0及以上的gradle版本已弃用 2 api可以完全代替compile 利用api导入的包可以被下级引用 3 implementation只是编译时引用 并不把引入的包打包进项目 4 java library项目依然
  • 操作系统真象还原实验记录之实验十五:多线程调度

    操作系统真象还原实验记录之实验十五 多线程调度 对应书P428 9 4节 1 相关基础知识 2 实验记录 2 1 实验流程 上次实验中 实现了一个线程的运行 具体是 1 申请了一页物理页作为PCB 2 init thread填写了位于PCB
  • 攻防世界--MISC题之坚持60s

    问题描述 难度系数 四颗星 题目来源 08067CTF 题目描述 菜狗发现最近菜猫不爱理他 反而迷上了菜鸡 题目场景 暂无 题目附件 附件1 题目分析 文件是一个jar文件 于是就想到了java 其实 在我看来 它就是一个压缩包 所以 大致
  • ROS 学习笔记(一)

    前言 最近在学习ros 为毕设作准备 和师兄交流过 想了想还是先把A 的路径规划给做完 然后在去做动态无限充电的实验好了 目前学习的视频还是经典中的经典 古月ros21讲 这个看完之后再去看师兄推荐的文章 vscode开发ROS1 3 创建
  • 【板子】 0-1背包问题 一维数组

    0 1背包问题 有 N 件物品和一个容量是 V 的背包 每件物品只能使用一次 第 i 件物品的体积是 vi 价值是 wi 求解将哪些物品装入背包 可使这些物品的总体积不超过背包容量 且总价值最大 输出最大价值 输入格式 第一行两个整数 N
  • C语言之生肖、年龄、星座查询

    程序实现输入年月日 输出星座生肖年龄 代码实现 include
  • chatgpt赋能python:Python如何随机生成26个字母

    Python如何随机生成26个字母 Python是一种流行的编程语言 被广泛用于数据分析 人工智能和Web开发等领域 Python中有很多库可以用于随机生成字符 包括Python内置的random库和第三方库string 在本文中 我们将介
  • GetCurrentDirectory和SetCurrentDirectory

    GetCurrentDirectory和SetCurrentDirectory是获取和设置的线程的当前工作路径 而不是线程所在路径 下面的代码是源文件所在路径下有一个文件为write txt 而上一级路径下没有这个文件 来说明这两个函数的功
  • 获取宝塔Linux面板登陆地址账号和密码

    在ssh终端输入 etc init d bt default
  • vs中出现bug error C1083:无法打开文件

    被自己的愚蠢惊呆了 这个bug是我自己手动造成的 编译的时候出现下面的情况 解决办法 找到项目 属性 C C 常规 然后就是直接 加上这句 GeneratedFiles 如图 成功解决这个问题
  • c++代码的编译

    1 gcc和g 1 1搞清楚几个名字 GCC GNU Compiler Collection GUN编译套件 可以编译c c java objective c Fortran等语言 gcc GCC中的 GUN C Compiler C 编译