C++编译初步

2023-05-16

C++ 编程中相关文件后缀

.a静态库 (archive)
.C
.c
.cc
.cp
.cpp
.cxx
.c++
C++源代码(需要编译预处理)
.hC或者C++源代码头文件
.iiC++源代码(不需编译预处理)
.o对象文件
.s汇编语言代码
.so动态库
<none>标准C++系统头文件

[编辑]单个源文件生成可执行程序

下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码:


/* helloworld.cpp */
#include <iostream>
int main(int argc,char *argv[])
{
    std::cout << "hello, world" << std::endl;
    return(0);
}  

程序使用定义在头文件 iostream 中的 cout,向标准输出写入一个简单的字符串。该代码可用以下命令编译为可执行文件:


$ g++ helloworld.cpp
  

编译器 g++ 通过检查命令行中指定的文件的后缀名可识别其为 C++ 源代码文件。编译器默认的动作:编译源代码文件生成对象文件(object file),链接对象文件和 libstdc++ 库中的函数得到可执行程序。然后删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。程序可以这样来运行:


$ ./a.out
hello, world
  

更普遍的做法是通过 -o 选项指定可执行程序的文件名。下面的命令将产生名为 helloworld 的可执行文件:


$ g++ helloworld.cpp -o helloworld
  

在命令行中输入程序名可使之运行:


$ ./helloworld
hello, world
  

程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示:


$ gcc helloworld.cpp -lstdc++ -o helloworld
  

选项 -l (ell) 通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字 libstdc++.a。而后它在标准库路径中查找该库。gcc 的编译过程和输出文件与 g++ 是完全相同的。

在大多数系统中,GCC 安装时会安装一名为 c++ 的程序。如果被安装,它和 g++ 是等同,如下例所示,用法也一致:


$ c++ helloworld.cpp -o helloworld
  

[编辑]多个源文件生成可执行程序

如果多于一个的源码文件在 g++ 命令中指定,它们都将被编译并被链接成一个单一的可执行文件。下面是一个名为 speak.h 的头文件;它包含一个仅含有一个函数的类的定义:


/* speak.h */
#include <iostream>
class Speak
{
    public:
        void sayHello(const char *);
};  

下面列出的是文件 speak.cpp 的内容:包含 sayHello() 函数的函数体:


/* speak.cpp */
#include "speak.h"
void Speak::sayHello(const char *str)
{
    std::cout << "Hello " << str << "\n";
}  

文件 hellospeak.cpp 内是一个使用 Speak 类的程序:


/* hellospeak.cpp */
#include "speak.h"
int main(int argc,char *argv[])
{
    Speak speak;
    speak.sayHello("world");
    return(0);
}  

下面这条命令将上述两个源码文件编译链接成一个单一的可执行程序:


$ g++ hellospeak.cpp speak.cpp -o hellospeak
  

PS:这里说一下为什么在命令中没有提到“speak.h“该文件(原因是:在“speak.cpp“中包含有”#include"speak.h"“这句代码,它的意思是搜索系统头文件目录之前将先在当前目录中搜索文件“speak.h“。而”speak.h“正在该目录中,不用再在命令中指定了)。

[编辑]源文件生成对象文件

选项 -c 用来告诉编译器编译源代码但不要执行链接,输出结果为对象文件。文件默认名与源码文件名相同,只是将其后缀变为 .o。例如,下面的命令将编译源码文件 hellospeak.cpp 并生成对象文件 hellospeak.o:


$ g++ -c hellospeak.cpp
  
  

命令 g++ 也能识别 .o 文件并将其作为输入文件传递给链接器。下列命令将编译源码文件为对象文件并将其链接成单一的可执行程序:


$ g++ -c hellospeak.cpp 
$ g++ -c speak.cpp 
$ g++ hellospeak.o speak.o -o hellospeak
  

选项 -o 不仅仅能用来命名可执行文件。它也用来命名编译器输出的其他文件。例如:除了中间的对象文件有不同的名字外,下列命令生将生成和上面完全相同的可执行文件:


$ g++ -c hellospeak.cpp -o hspk1.o 
$ g++ -c speak.cpp -o hspk2.o 
$ g++ hspk1.o hspk2.o -o hellospeak
  

[编辑]编译预处理

选项 -E 使 g++ 将源代码用编译预处理器处理后不再执行其他动作。下面的命令预处理源码文件 helloworld.cpp 并将结果显示在标准输出中:


$ g++ -E helloworld.cpp
  

本文前面所列出的 helloworld.cpp 的源代码,仅仅有六行,而且该程序除了显示一行文字外什么都不做,但是,预处理后的版本将超过 1200 行。这主要是因为头文件 iostream 被包含进来,而且它又包含了其他的头文件,除此之外,还有若干个处理输入和输出的类的定义。

预处理过的文件的 GCC 后缀为 .ii,它可以通过 -o 选项来生成,例如:


$ gcc -E helloworld.cpp -o helloworld.ii
  

[编辑]生成汇编代码

选项 -S 指示编译器将程序编译成汇编语言,输出汇编语言代码而后结束。下面的命令将由 C++ 源码文件生成汇编语言文件 helloworld.s:


$ g++ -S helloworld.cpp
  

生成的汇编语言依赖于编译器的目标平台。

[编辑]创建静态库

静态库是编译器生成的一系列对象文件的集合。链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。库中的成员包括普通函数,类定义,类的对象实例等等。静态库的另一个名字叫归档文件(archive),管理这种归档文件的工具叫 ar 。

在下面的例子中,我们先创建两个对象模块,然后用其生成静态库。

头文件 say.h 包含函数 sayHello() 的原型和类 Say 的定义:

/* say.h */
#include <iostream>
void sayhello(void);
class Say {
    private:
        char *string;
    public:
        Say(char *str)
        {
            string = str;
        }
        void sayThis(const char *str)
        {
            std::cout << str << " from a static library\n";
        }
        void sayString(void);
};  
下面是文件 say.cpp 是我们要加入到静态库中的两个对象文件之一的源码。它包含 Say 类中 sayString() 函数的定义体;类 Say 的一个实例 librarysay 的声明也包含在内:

/* say.cpp */
#include "say.h"
void Say::sayString()
{
    std::cout << string << "\n";
}
 
Say librarysay("Library instance of Say");  
源码文件 sayhello.cpp 是我们要加入到静态库中的第二个对象文件的源码。它包含函数 sayhello() 的定义:

/* sayhello.cpp */
#include "say.h"
void sayhello()
{
    std::cout << "hello from a static library\n";
}  
下面的命令序列将源码文件编译成对象文件,命令 ar 将其存进库中:

$ g++ -c sayhello.cpp
$ g++ -c say.cpp
$ ar -r libsay.a sayhello.o say.o
  

程序 ar 配合参数 -r 创建一个新库 libsay.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。

下面是主程序 saymain.cpp,它调用库 libsay.a 中的代码:

/* saymain.cpp */
#include "say.h"
int main(int argc,char *argv[])
{
    extern Say librarysay;
    Say localsay = Say("Local instance of Say");
    sayhello();
    librarysay.sayThis("howdy");
    librarysay.sayString();
    localsay.sayString();
    return(0);
}  

该程序可以下面的命令来编译和链接:


$ g++ saymain.cpp libsay.a -o saymain
  

程序运行时,产生以下输出:


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

C++编译初步 的相关文章

  • mach-mini2440.c:155: error: array type has incomplete element type

    我按照最新mini2440 linux移植开发指南时 xff0c 在操作 移植Nand 驱动并更改分区信息 时 xff0c 按照文档修改后 xff0c 再编译zImage时 xff0c 总是编译通不过 xff0c 下面是出错信息 arch
  • Visual Assist 在VS2022中安装失败问题

    直接找到C Users xxxxx AppData Local Microsoft VisualStudio 17 0 xxxxx 文件夹 直接右击删除这个文件夹 注意要在VS2022关闭时再删除 可以先做一次备份 正常运行安装VA X S
  • linux c 获取文件的时间信息

    gt File Name hello c gt Author lizhu gt Mail gt Created Time 2015年11月20日 星期五 10时30分20秒 include lt time h gt include lt s
  • Linux下C语言来检测USB设备以及自动区分U盘和硬盘并自动挂载

    别的不说直接上代码 作用就是在linux系统上可以直接判断哪个是USB设备节点 xff0c 哪个是硬盘设备节点 xff0c 如果想挂载某一个节点 想屏蔽某一个USB孔的USB设备 xff0c 具体代码 xff0c 正在整理中 xff0c 下
  • glib 交叉编译步骤

    借鉴文章网址为 wiki beyondlogic org index php title 61 Cross Compiling BlueZ Bluetooth tools for ARM 编译glib需要zlib libffi两个库文件我使
  • STM32中SysTick、FCLK、SYSCLK、HCLK

    http rmingwang com the stm32 systick fclk sysclk hclk html 转载原文 在STM32中 xff0c 有五个时钟源 xff0c 为HSI HSE LSI LSE PLL HSI是高速内部
  • qglobal.h:45: error: C1083: 无法打开包括文件:

    看了很多人的错误调试记录就是不行 xff0c 后来在百度知道里面看到这个 xff0c 添加进入后就可以了 在系统环境变量path 添加下面内容即可 SystemRoot system32
  • 卡尔曼滤波器学习笔记(二)

    扩展卡尔曼滤波器的原理及应用 经典的卡尔曼滤波只适用于线性且满足高斯分布的系统 xff0c 但实际工程中并不是这么简单 xff0c 比如飞行器在水平运动时有可能伴随着自身的自旋 xff0c 此时的系统并不是线性的 xff0c 这时就需要应用
  • 串口回环测试

    串口lookback测试 基础知识 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff09 xff0c 通常称作UART UART 是一种通用的数据通信协议 xff
  • STM32学习--USART

    串口工作方式 1 查询 xff1a 串口程序不断循环查询 xff0c 看看有没有数据需要它发送 2 中断 xff1a 平时串口只要打开中断即可 如果有中断来即需要传输数据 xff0c 它就马上进行数据的传输 STM32编程 xff1a 1
  • Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结Atitit HT

    Atitit HTTP 认证机制 基本验证 Basic Authentication 和摘要验证 Digest Authentication attilax总结 1 1 最广泛使用的是基本验证 Basic Authentication 和摘
  • 实验二 读取和理解激光雷达数据

    1 体验内容 xff08 1 xff09 为rplidar添加USB权限 注 xff1a 实验室的rplidar A2买得比较早 xff0c 硬件版本可能与github程序不匹配 xff0c 出现运行错误 xff0c 解决方法为到 Wind
  • Linux下使用Netfilter框架编写内核模块(统计协议层ping特定地址丢包数)

    一 linux内核中neitfilter的处理过程 1 5个HOOK点的执行点说明 xff1a 数据包从进入系统 xff0c 进行IP校验以后 xff0c 首先经过第一个HOOK函数NF IP PRE ROUTING进行处理 xff1b 然
  • 基于TCP 实现客户端之间通信【1】

    前段时间学习了基于TCP协议下实现服务器与一个客户端的通信 xff0c 服务器与多个客户端之间的通信 xff0c 以及客户端之间的互相通信 下面就是我写的利用TCP和多线程技术实现客户端之间互相通信的代码 xff1a 服务器端 xff1a
  • 回环接口(loop-back/loopback)

    回环接口 xff08 loop back loopback xff09 Moakap 整理 Loopback 接口是一个虚拟网络接口 xff0c 在不同的领域 xff0c 其含义也大不一样 1 xff0e TCP IP 协议栈中的 loop
  • socket封装HTTP请求

    之前写过两个socket封装的HTTP GET请求 xff0c 可是知其然 xff0c 不知所以然 这次写POST请求就有点懵逼了 还是从大佬的文章出发 xff1a https blog csdn net a19881029 article
  • access中,如何删除不可见空格

    1 可以使用 Trim 函数 xff0c 删除字符串 首 尾 的正常空格 span class token keyword update span 表名 span class token keyword set span 字段 span c
  • Raspberry Pi树莓派分类和其相似产品介绍

    文章目录 前言一 1代树莓派二 2代树莓派三 3代树莓派四 4代树莓派五 树莓派Pico六 目前可替代板子介绍引用 前言 树莓派官网 作为小型计算机的代表 xff0c 树莓派可是作为开山鼻祖 xff0c 本文聊一下目前树莓派几代板子发展历程
  • ARM汇编指令ldr和MOV的区别

    1 八位图 数据 2 MOV指令 MOV指令可以把立即数或者寄存器内容 xff08 注意 xff1a 这里绝对不可以是内存 xff01 xff01 xff09 传递给一个寄存器 MOV对于立即数是有要求的 xff0c 就是上边的 8位图 数
  • GPS NEMA 0183协议

    一 NMEA0183标准语句 GPS常用语句 GPGGA 例 xff1a GPGGA 092204 999 4250 5589 S 14718 5084 E 1 04 24 4 19 7 M 0000 1F 字段0 xff1a GPGGA

随机推荐

  • 使用setvbuf更改printf的默认buffer 行为

    有3种buffer行为 xff0c 不缓冲 xff0c 基于块的缓冲 和 基于行的缓冲 stdout xff08 printf xff09 默认是基于行的缓冲 xff0c 即写到stdout的字符都会被缓冲起来直到一个换行符输出的时候 xf
  • linux 下 tcpdump详解 后篇(自己实现抓包过滤)

    一 概述 在了解了tcpdump的原理后 xff0c 你有没有想过自己去实现抓包过滤 xff1f 可能你脑子里有个大概的思路 xff0c 但是知道了理论知识 xff0c 其实并不能代表你完全的理解 只要运用后 xff0c 你才知道哪些点需要
  • 结构体与共同体(联合体)的妙用

    结构体与共同体 xff08 联合体 xff09 的妙用 学习过C语言后 xff0c 大家都了解了结构体与共同体 两者之间的区别是 xff1a 共同体 xff1a 使几个不同类型的变量共占一段内存 相互覆盖 所占内存长度是各最长的成员占的内存
  • [北力电子] 无人机4G图传数传一体 pixhawk mavlink GSLINK 720P

    随着无人机和4G技术的发展 xff0c 实时监看空中视角的画面已经成为可能GSLINK突破传统的传输方式 xff0c 利用了4G网络将数据和视频流融为一体进行无限距离的传输 用户使用EC2地面站 xff08 Mission Planner
  • C#笔记(基础篇)

    简介 第一次发博客 xff0c 欢迎交流沟通 因为学习虚拟现实需要所以暑假一个月学了点C xff0c 做了笔记 xff0c 在这进行分享 xff0c 欢迎浏览 有些代码打在VS中 没有记录在笔记里 请见谅 xff08 视频指路 xff09
  • 《机器人操作系统(ROS)浅析》笔记

    机器人操作系统 xff08 ROS xff09 浅析 这是看了 A Gentle Introduction to ROS 这本书后记的笔记 xff0c 网上刚好找得到中文版的 xff0c 就看中文版了 xff0c 欢迎大佬批评指正 xff0
  • 搭建ROS小车——硬件购买篇(基于arduino mega2560,L298N)

    在寒假期间完成了ROS小车的制作 xff0c 记录一下 xff0c 不过也有很多不足 xff0c 之后再进行修正 xff0c 本系列文章将分为硬件购买篇 下位机篇 上位机篇 功能拓展篇四个部分来进行讲解 上位机 树莓派3B 43 16GBS
  • 搭建ROS小车——上位机篇(基于arduino mega2560,L298N)

    环境 上位机为树莓派3B 43 环境 xff1a ubuntu mate16 04 43 ros kineticros master在电脑上 xff0c 环境为ubuntu18 04 43 ros melodic 考虑到之后可能会拓展别的功
  • R语言入门学习

    R语言 视频链接 xff1a https www bilibili com video BV19x411X7C6 数据分析过程 数据采集 数据存储 数据分析 数据挖掘 数据可视化 进行决策 1 Rstudio使用 1 1 入门 TAB补齐
  • IO多路复用实现TCP并发服务器(select)

    大致描述一下 先定义 fd set 要监视的读事件readfds xff0c FD SET将sockfd放到readfds事件里 xff0c 更新文件最大描述符 xff0c select函数返回值是返回准备好的文件描述符个数 xff08 这
  • 网页中播放RTSP(2) H5Stream

    总的思路是全面的7种方法 xff0c RTSP转换成RTMP WebSocket WebRTC HLS xff0c 再从网页中获取 而这个转换过程 xff0c 就是一个视频服务器端 xff0c 通过视频服务器软件转换RTSP为其他协议格式
  • 固态硬盘在IDE、AHCI模式下的速度对比

    AHCI全名 Advanced Host Controller Interface xff0c 中译 xff1a 高级主机控制接口 xff0c 它是 Intel 所主导的一项技术 xff0c 可以发挥SATA硬盘的潜在加速功能 xff0c
  • Win10 64位双系统UEFI官网下载镜像安装(不用PE)

    1 刻录Win10 ISO镜像 2 U盘UEFI启动 先设置BIOS xff0c Boot Mode xff1a UEFI Secure Boot OFF 3 在 要安装的语言 界面 xff0c 按shift 43 F10调出DOS窗口 4
  • FreeRTOS实验一:portYIELD_FROM_ISR()任务切换的时机分析

    分析下portYIELD FROM ISR 任务切换的时机 span class token keyword void span span class token function HAL UART RxCpltCallback span
  • HAL_DMA_IRQHandler()代码详细分析

    这里使用ADC1联动DMA1 xff0c 开启半传输中断 传输中断 debug时 xff0c dma也一直在工作 xff0c 所以半传输中断 传输中断会同时生效 1 adc1使用了DMA1 Stream0 xff0c Instance表示如
  • AD单层显示

    1 Shift 43 S实现的单层效果 xff08 其他曾黑白显示 xff09 2 隐藏其他层 xff0c 只显示一层 xff0c 这样显示直观 xff0c 效果更好
  • 解决Windows更新失败(0x8007000d)的详细方法

    Window更新时 xff0c 一直处于 正在准备windows xff0c 请不要关闭你的计算机 xff0c 时间太长了 xff0c 直接重启 xff0c 再进系统发现这样子了 此代码表示有需要更新的文件丢失或损坏 管理员方式运行cmd
  • A320M HDV 4.0主板用CH341A手动刷BIOS支持5600g,内存不兼容问题排查

    电脑从AMD 3200g 升级到5600g xff0c 主板使用的是华擎A320m HDV R4 0 xff0c BIOS从7 20开始支持5600g xff0c 在没有CPU情况下只能使用BIOS烧录器手动烧录最新BIOS文件 xff0c
  • keil4中增加新器件(厂家未提供keil4支持包)编辑CDB文件

    1 C Keil UV4 FMSH cdb CPU 61 IRAM 0x20000000 0x20003FFF IROM 0x0000000 0x001FFFF CPUTYPE Cortex M0 CLOCK 12000000 ELITTL
  • C++编译初步

    C 43 43 编程中相关文件后缀 a静态库 archive C c cc cp cpp cxx c 43 43 C 43 43 源代码 xff08 需要编译预处理 xff09 hC或者C 43 43 源代码头文件 iiC 43 43 源代