gcc编译C++程序

Docker系列教程01-使用Docker镜像_开源docker镜像 如何使用 Docker镜像是一个只读的模板。如果读者之前是VM管理员,则可以把Docker镜像理解为VM模板,如果您是一名研发人员,可以将镜像理解为类(class)。简单说,Docker镜像是一个不包含系统内核而又精简的操作系统。例如:一个镜像可以包含一个基本的 ubuntu 操作系统环境,里面仅安装了 Nginx 应用程序。可以把它称为Nginx镜像。 阅读详情

单个源文件生成可执行程序
下面是一个保存在文件 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");源码文件 syshello.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 SayLocal instance of Say
Linux 编译C++程序的四种方法 前面那些文件都没用了,你需要重新建立一个空文件夹,在里面编写一个libHelloSLAM.cpp文件,内容如下(里面定义一堆函数)然后你就会在build里得到一个helloSLAM没有后缀的文件 ,在终端输入 ./helloSLAM就可以执行这个文件。你有一个test.cpp文件,然后你需要建立一个CMakeList.txt文件,内容如下。然后就会在build里面生成一个没有后缀的useHello文件。在终端输入 ./a.out 就可以执行。然后就会得到一个a.out 文件。你有一个test.cpp文件。 阅读详情

相关推荐

GCC和G++有什么区别?c++和g++程序的区别?GCC只能编译C语言吗?gcc 1.cpp和g++ 1.cpp有什么区别?

gcc命令不止能编译C语言,还可以编译C++(内部等同于调用g++)或Fortran等(编译其它语言相当于调用对应语言的编译器),g++只能编译C或者C++.如果仅仅考虑C语言,参考此公式:g++ == gcc -xc++ -lstdc++ -shared-libgcc.

编程语言开发、框架原理、编程思想、最佳实践技巧经验分享。致力于各种编程技术的技巧经验干货分享,讲解开发避坑技巧,追踪开发前沿技术,实战展开解决难题。 程序员小迷助您在编程路上越走越好! 1433

Linux基础工具|C/C++编译器:gcc/g++的使用

gcc是专门用来编译C语言的编译器,而g++是编译C++的编译器(也可以编译C语言,毕竟C++语言兼容C)。

limou3434的博客 8708

windows下gcc编译C、C++程序 MinGW编译器

windows下gcc编译C、C++程序 MinGW编译器

hgggg2003的博客 4768

Linux 系统下 C/C++ 程序编译

一文理解Linux系统下,C/C++程序编译的过程!

qq_46457076的博客 7137

yum镜像源问题:File contains no section headers.

报:File contains no section headers. 原因是没有配置yum源!解决如下: 第一种方案: 修改/etc/yum.repos.d/CenOS-Base.repo文件内容如下: #CentOS-Base.repo # #ThemirrorsystemusestheconnectingIPaddressoftheclienta...

C-A-L-D 1万+

深度学习分类任务中,正负样本比例失衡的5种实战解决方案(附代码)

本文深入探讨了深度学习分类任务中正负样本比例失衡的5种实战解决方案,包括智能采样技术、动态数据增强、损失函数工程、模型架构创新和训练策略优化。针对信用卡欺诈检测、医疗诊断等场景,提供了详细的代码实现和评估方法,帮助开发者有效解决样本不平衡问题,提升模型在真实场景中的表现。

h9j8k7l6m5n的博客 424

gcc编译c++文件_如何编译和运行C++程序?

C++ 和C语言类似,也要经过编译和链接后才能运行。在《C语言编译器》专题中我们讲到了 VS、Dev C++、VC 6.0、Code::Blocks、C-Free、GCC、Xcode 等常见 IDE 或编译器,它们除了可以运行C语言程序,还可以运行 C++ 程序,步骤是一样的,这里不再赘述,读者需要留意的是 C++ 源文件的后缀,以及 GCC 中的g++命令。下图是 C/C++ 代码生成可执行文件...

weixin_36434531的博客 1736

STM32G4系列数字LLC控制程序开发实战

本文详细介绍了基于STM32G4系列MCU的数字LLC控制程序开发全流程。从开发环境搭建、中断服务函数设计,到核心的电压环PID算法、Burst模式控制、状态机设计以及软启动优化,提供了完整的实战代码和关键参数调试经验,帮助开发者高效实现高性能数字电源控制。

weixin_29185493的博客 278

[linux]使用g++/gcc编译c++程序

在linux环境下,g++可以编译c++程序 在链接阶段之前,是使用gcc完成的,但是gcc无法完成cpp程序的链接 链接是由g++完成的 一个简单的例子: //main.cpp #include<iostream> using namespace std; int main(){ cout<<"hello world"<<endl; ...

... 396

智能手环心率检测不准?用STM32+MAX30102教你实现医疗级精度(含算法优化)

本文详细解析了如何利用STM32微控制器和MAX30102光学传感器实现医疗级精度的心率检测方案。通过硬件参数调校、ADC采集优化、运动伪影消除及深度学习算法改进,显著提升智能手环在静态和运动状态下的检测精度,误差可控制在±1.5bpm以内,满足医疗电子标准。

weixin_28335283的博客 524

“EXB文件的格式和编程“

首先,打开文件并读取文件头,然后解析文件头中的元数据信息。接下来,循环读取数据块,每次读取块头部分,解析块的大小和类型,并读取相应大小的块数据。文件头(Header):EXB文件通常包含一个文件头,用于存储关于文件的元数据信息。读取EXB文件时,首先需要解析文件头,以了解文件的属性和数据结构。总结起来,EXB文件是一种常见的二进制数据文件格式,在编程中处理EXB文件需要了解其基本结构和元数据信息。通过以上代码,您可以根据自己的需求扩展处理其他类型的数据块,或者根据EXB文件的具体规范进行解析和处理。

HackCyberX的博客 1531

GCC编译器——利用GCC编译器编译C/C++程序

以下内容源于C语言中文网的学习与整理,非原创,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 5728

微信H5网页支付JSAPI部分用户报错:system:access_denied 的解决方案

JSAPI 支付仅支持微信内置浏览器调用。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1683

C++:GCC编译:GCC编译C++程序分步流程

C++:GCC编译:GCC编译C++程序分步流程

C++ JAVA的专栏 4020

Windows 下 Hermes Agent(爱马仕)安装全记录:从零到一的保姆级图文教程

本文主要介绍了Windows 下 Hermes Agent(爱马仕) 安装全记录:从零到一的保姆级图文教程,希望能对学习使用 Hermes Agent 的同学们有所帮助。 文章目录 1. 背景 2. 实战教程 2.1 步骤一 安装WSL环境 2.2 步骤二 安装Python环境 2.3 步骤三 安装Hermes Agent 2.4 步骤四 修正 API Key 错误 2.5 步骤五 配置多个模型 2.6 步骤六 启动Hermes Agent 3. 常见问题及解决方案 4. 总结

weixin_43178406的博客 14万+

【GPFS专题4】---IBM Spectrum Scale (GPFS) 原理详解

IBM Spectrum Scale(原名为 GPFS,General Parallel File System)是一种高性能、分布式的集群文件系统,专为大规模数据共享和并行访问设计。它允许多个客户端同时访问共享文件,提供高可用性、容错性和扩展性,广泛应用于高性能计算(HPC)、大数据分析、AI 训练和企业级存储场景。IBM Spectrum Scale 通过分布式架构、并行访问和智能数据管理,为企业提供了高性能、高可用、可扩展的存储解决方案。

jundao1997的专栏 777

GCC编译 c++程序

用GCC编译C++程序时,链接的库文件应为libstdc++.so,而不是默认的libc.so,因此应用-lstdc++参数指明,否则会在链接时发生错误。       用G++编译则没有这个问题。 文章来源:http://blog.ednchina.com/chwb/161559/message.aspx 误区一:gcc只能编译c代码,g++只能编译c++代码 两者都可以,但是请

倦鸟归时 1428

IEEE69节点数据(Matlab)

IEEE69节点数据(Matlab)

weixin_46039719的博客 1161

gcc编译c++程序

gcc编译c++程序 分类: Linux2011-01-25 12:40 3508人阅读 评论(0) 收藏 举报 gccc++referencebasic编译器fortran 原来一直以为gcc是c的linux下的编译器,g++是c++的linux下的编译器,今天偶尔看到一个说明文档,大体内容是gcc已经不单纯的可以编译C语言,它支持C, C++, Objective-C

Stroller 650

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

linux用gcc编译完怎么运行,linux下使用gcc编译运行C/C++程序

编译C首先,程序编译过程有:1.预处理(展开宏,头文件,检查代码是否有误)2.编译(将.c转为汇编代码.s)3.汇编(将汇编代码.s转为机器代码.o)4.链接(将所有机器代码.o和库文件链接成一个可执行程序)一般编译常常包括了:预处理,编译,汇编在linux系统中,编译c使用gcc编译器,如下:gcc -o out in1.c in2.c //gcc编译以及链接(对in1文件...

weixin_35897853的博客 3509

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

使用Linux GCC编译C++程序

本文摘录自C语言网,有需求的可自行前往C语言网查看。

Absurd_Fox的博客 342

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

·ubuntu系统使用gcc和makefile编译C++程序

通过更换Ubuntu系统的软件源,可以显著提高软件更新和安装的速度。在Ubuntu下进行C++编程时,使用。

zzs030414的博客 2368

用gcc编译C++程序

用gcc编译C++程序2010-04-10 23:31<br />用GCC编译C++程序时,链接的库文件应为libstdc++.so,而不是默认的libc.so,因此应用-lstdc++参数指明,否则会在链接时发生错误。<br />       用G++编译则没有这个问题。<br /><br /> 文章来源:http://blog.ednchina.com/chwb/161559/message.aspx<br /><br /> 误区一:gcc只能编译c代码,g++只能编译c++代码 <br />

700
上一篇: 学习C++ -> 类(Classes)的定义与实现
下一篇: c++ 类的继承与派生
csshuke
博客等级 码龄16年 1517粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值