Linux C++ 开发2 - 编写、编译、执行第一个程序

news/2024/11/18 9:36:18/文章来源:https://www.cnblogs.com/luoweifu/p/18349686

上一篇《Linux C++ 开发1 - 搭建C++开发环境》我们搭建好了C++的开发环境,本篇我们将编写、编译、执行第一个程序。

1. 第一个C++程序

1.1. demo01.cpp

这里写一个最简单的HelloWord程序

#include <iostream>int main()
{std::cout << "Hello, world!" << std::endl;return 0;
}

1.2. 编译和执行

这是最简单的编译和执行方式

# 进入源码目录
cd demo 
# 编译: g++ ./demo01.cpp 
g++ ./demo01.cpp 
# 执行: ./a.out 
./a.out 
Hello, world!

2. 更多编译选项

2.1. 指定编译的目标文件名

g++ ./demo01.cpp -o ./demo01
# 或
# g++ -o ./demo01 ./demo01.cpp
./demo01 
Hello, world!

2.2. 先编译再链接

上面的命令直接把源码编译链接成了可执行文件,真实的编译过程至少经历了:预处理、编译、链接的过程。我们把编译过程拆解成编译、链接两个过程。

# 只编译不链接,生成目标文件:demo01.o
g++ -c ./demo01.cpp
# 将目标文件链接成可执行文件:demo01
g++ -o ./demo01 ./demo01.o
# 执行可执行文件
./demo01 
Hello, world!

3. gcc 与 g++

GCC(GNU Compiler Collection)是一套由GNU项目开发的支持多种编程语言的编译器工具链,里面包含了gccg++工具。更多C/C++编译器的介绍参见《一文搞懂C/C++常用编译器》。

3.1. gcc编译C++代码

上面的代码是g++来编译的,其实我们也可以通过gcc来编译,命令如下:

# 方法一
# 注意:不加-lstdc++的话,链接会报错。
gcc demo01.cpp -lstdc++
./a.out 
Hello, world!
# 方法二
gcc -o demo01 demo01.cpp -lstdc++
./demo01 
Hello, world!
# 方法三
gcc -c ./demo01.cpp
gcc -o ./demo01 ./demo01.o -lstdc++ 
./demo01 
Hello, world!

可以看到gcc也可以正确编译C++的代码,区别是需要加-lstdc++参数。这是因为g++默认链接了libstdc++,而gcc默认不链接,需要手动指定。

3.2. gcc与g++的区别

GUN的gcc和g++都是编译器驱动程序,用于编译和链接源代码。它们的主要区别在于处理C++代码时的行为和默认设置。以下是它们的主要区别:

1. 默认语言标准:

gcc:默认处理C语言代码。
g++:默认处理C++语言代码。

2. 编译器前端:

gcc:使用GCC(GNU Compiler Collection)的C编译器前端。
g++:使用GCC的C++编译器前端。

3. 默认库链接:

gcc:在链接阶段,默认只链接C标准库。
g++:在链接阶段,默认链接C++标准库,同时也会链接C标准库。

4. 处理C++特定语法和特性:

gcc:不支持C++特定的语法和特性。
g++:支持C++特定的语法和特性,如类、模板、命名空间等。

5. .c源文件的编译:

gcc:把它当作是C程序。
g++:当作是c++程序。

备注: 后缀为.cpp的,两者都会认为是c++程序。

6. 编译选项:

gcc:可以使用-lstdc++选项来链接C++标准库。
g++:不需要额外选项,默认链接C++标准库。

总结来说,gcc主要用于编译C代码,而g++主要用于编译C++代码,并且在链接阶段会自动处理C++标准库的链接。如果你需要编译C++代码,建议使用g++,这样可以避免手动指定链接C++标准库的麻烦。

4. gcc 和 g++ 的常用编译选项

4.1. 常用编译选项

  1. 基本选项

    • -o <file>:指定输出文件的名称。
    • -c:只编译不链接,生成目标文件(.o)。
    • -E:只进行预处理,不编译、汇编或链接。
    • -S:只编译不汇编,生成汇编代码文件(.s)。
  2. 优化选项

    • -O0:不进行优化(默认)。
    • -O1:基本优化。
    • -O2:更多优化,但会增加编译时间。
    • -O3:最大程度优化,可能会显著增加编译时间。
    • -Os:优化大小,适用于嵌入式系统。
  3. 调试选项

    • -g:生成调试信息,用于调试工具(如GDB)。
    • -ggdb:生成GDB专用的调试信息。
  4. 警告选项

    • -Wall:启用所有警告。
    • -Wextra:启用额外的警告。
    • -Werror:将警告视为错误。
  5. 语言标准选项

    • gcc编译C语言(.c)时使用的C标准:
      • -std=c99:使用C99标准。
      • -std=c11:使用C11标准。
      • -std=gnu99:使用GNU扩展的C99标准。
      • -std=gnu11:使用GNU扩展的C11标准。
    • g++编译C++(.cpp)时使用的C标准:
      • -std=c++98:使用C++98标准。
      • -std=c++03:使用C++03标准。
      • -std=c++11:使用C++11标准。
      • -std=c++14:使用C++14标准。
      • -std=c++17:使用C++17标准。
      • -std=c++20:使用C++20标准。
  6. 链接选项

    • -l<library>:链接指定的库。
    • -L<path>:指定库文件的搜索路径。
    • -static:静态链接库。
  7. 预处理器选项

    • -D<name>:定义宏。
    • -D<name>=<value>:定义带值的宏。
    • -I<path>:添加头文件搜索路径。
  8. 链接C++标准库:

    • -lstdc++: 链接C++标准库。(gcc编译.cpp时要加上此选项;g++编译可不加,因为默认会链接C++标准库)
  9. 其他选项

    • -v:显示编译器的版本和配置信息。
    • -save-temps:保存中间文件(如预处理文件、汇编文件等)。

4.2. 示例

g++ -o myprogram myfile.cpp -std=c++11 -O2 -Wall -g

上面的命令将编译myfile.cpp文件,生成myprogram可执行文件,使用C++11标准,优化级别为2,启用所有警告,生成调试信息。


大家好,我是陌尘。

IT从业10年+, 北漂过也深漂过,目前暂定居于杭州,未来不知还会飘向何方。

搞了8年C++,也干过2年前端;用Python写过书,也玩过一点PHP,未来还会折腾更多东西,不死不休。

感谢大家的关注,欢迎加我微信(Spencer_MC),期待与大家一起交流。



【SunLogging】
扫码二维码,关注微信公众号,阅读更多精彩内容

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷P1194 买礼物之警钟敲爆

洛谷P1194题解传送锚点摸鱼环节 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买 \(B\) 样东西,巧的是,这 \(B\) 样东西价格都是 \(A\) 元。 但是,商店老板说最近有促销活动,也就是: 如果你买了第 \(I\) 样东西,再买第 \(J\) 样,那么就可以只花 \(K_{I,J}\) 元…

CSP16

这题,唯一坑点,子序列是不连续的 注意,子序列可以不连续,子串必须连续。 有一个很显然的暴力点击查看代码 int dp[N][N],n,p[N],q[N]; int main() {speed();freopen("in.in","r",stdin);freopen("out.out","w",stdout);cin>>n…

潜在新就业岗位超300万个 原生鸿蒙开发创造百万级人才缺口

在数字化转型的浪潮中,开发者作为数字经济的建设者和创新者,成为了推动社会进步的重要⼒量。InfoQ 研究中⼼最新发布的《中国开发者画像洞察研究报告2024》显示,截至2023年年底,中国泛开发者⼈数高达2067.21万,增速为2.5%。在这2000多万人中,鸿蒙⽣态吸引了超过254万开发…

python numpy

import numpy as np a=np.array([1,2,3,4]) b=np.array([5,6,7,8]) #相应项相乘再相加 print(np.inner(a,b)) #a的每一项乘以b的每一项组成新的矩阵 print(np.outer(a,b))

开发者洞察报告:百万级鸿蒙岗位缺口,开发者薪资涨幅43.1%

最近,极客邦科技双数研究院InfoQ研究中心《中国开发者画像洞察研究报告2024》正式发布,分析了开发者群体在数字经济浪潮中的新趋势与显著变化。根据《国资委79号文件》指示,2027年底,全部国央企必须完成信息化系统的信创改造。而HarmonyOS系统作为国产自研信创软件的代表,…

CH6 CH7

CH-6 时间与窗口 6.1 时间语义事件时间(Event Time):数据产生的时间,默认使用处理时间(Processing Time):数据到达窗口的时间摄入时间:被Flink Source读入的时间6.2 水位线 6.2.1 逻辑时钟 在使用事件时间时,Flink使用逻辑时钟对数据进行窗口计算。逻辑时钟依靠数据的时间…

CH2~CH5

一个Flink程序,就是对DataStream进行各种转换。基本上由以下几部分构成接下来分别从执行环境、数据源、转换操作、输出四大部分,介绍DataStream API。 导入Scala DataStream Api import org.apache.flink.streaming.api.scala._CH-5 DataStream API基础 一、执行环境 1.1 创建…

中国式报表搞不定?告诉你如何轻松解决

中国式报表,顾名思义,是一种在中国企业中广泛使用的报表格式。这种报表通常格式复杂、数据量大、数据层次多,涵盖了从基本数据到高层分析的各个层面。每一个字段都可能代表着不同的含义,每一列数据都有着深厚的背景,这让很多报表工具望而却步。然而,要想在中国企业中高效…

git的快速入门(含常用指令)

目录概念什么是gitgit与GitHub有什么区别提交、仓库、分支git的使用从GitHub上下载别人的代码直接将代码下载到本地克隆仓库获取代码将自己的代码上传到GitHub 本文拟将用通俗的语言描述git的使用方法,如有出入,请批评指正 概念 什么是git Git可以想象成一个超级高效的"…

最全MySQL面试20题和答案(二)

接第一期的MySQL面试二十题,这是之后的20题!索引百万级别或以上的数据如何删除? 关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加、修改、删除都会产生额外的对索引文件的操,这些操作需要消耗额外的IO,会降低增/改/删的执行…

Spring关于bean的一些基本知识

介绍了bean所需要关注的一些基本知识,掌握这些知识应该大体上可以满足信息应用开发在spring这座大厦中,去除掉最底部的核心(core)组件,那么最重要的无疑是bean和bean工厂。 剩余是AOP、设计模式,更之上的就是各种组件:DATA,WEBMVC...为了便于行文,这里把bean和bean工厂…

基于SiliconCloud快速体验GraphRag.Net

本文介绍了如何基于SiliconCloud快速体验GraphRag.Net。SiliconCloud介绍 SiliconCloud 基于优秀的开源基础模型,提供高性价比的 GenAI 服务。 不同于多数大模型云服务平台只提供自家大模型 API,SiliconCloud上架了包括 Qwen、DeepSeek、GLM、Yi、Mistral、LLaMA 3、SDXL、In…