首页 > 系统相关 >Linux C++ 开发2 - 编写、编译、执行第一个程序

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

时间:2024-08-08 20:41:06浏览次数:9  
标签:gcc ++ C++ 编译 demo01 Linux 链接

上一篇《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】 扫码二维码,关注微信公众号,阅读更多精彩内容

标签:gcc,++,C++,编译,demo01,Linux,链接
From: https://www.cnblogs.com/luoweifu/p/18349686

相关文章

  • C++ 根据层序遍历数组 构造二叉树
    说明该层序遍历数组中空节点会使用-1代替,即该层序遍历数组可以理解为一个完全二叉树代码利用队列实现左右子节点的存储,每次通过获取队列头部元素即为当前头节点,然后在数组中i和i+1对应该头结点下的左右子节点,如果不为-1,那么说明可以入队。structTreeNode{intval;Tree......
  • 【AcWing】Linux基础课_讲义
    Linux基础课-AcWing部分内容有所修改1.常用文件管理命令:正确的学习方式:边学边查。先跟着官方文档的快速入门过一遍,然后在实际工程项目中有需要的再去查。命令行,方便批量化操作。Linux各目录及每个目录的详细介绍-lin_zone-博客园(cnblogs.com)常用文件夹/根目录/......
  • Linux远程终端MobaXterm下载安装配置使用(详细)
    今天给伙伴们分享一下Linux远程终端MobaXterm下载安装配置使用,希望看了有所收获。我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!如果伙伴们看了文档觉得有用,欢迎大家......
  • Linux操作系统简介
    今天给伙伴们分享一下Linux操作系统简介,希望看了有所收获。我是公众号「想吃西红柿」「云原生运维实战派」作者,对云原生运维感兴趣,也保持时刻学习,后续会分享工作中用到的运维技术,在运维的路上得到支持和共同进步!如果伙伴们看了文档觉得有用,欢迎大家关注我的公众号,获取相......
  • 使用wsl,windows自带的linux虚拟机
     右键,管理员模式第一次安装,先更新一下wsl组件wsl--updatewsl--status是否为2,不是的话需要设置一下在windows应用商店直接可以下载 Ubuntu时,默认情况下并不会设置root用户的密码,而是鼓励用户使用sudo命令以获得管理员权限。root账户通常是禁用的,并且没有默认......
  • windows 编译 openssl + libcurl libcurl库
    主要参考https://blog.icrystal.top/archives/11.htmlopenssl编译网址: https://www.openssl.org/source下载的是3.0.13版本的这边是说Perl:需要Perl来运行OpenSSL的构建脚本。你可以从StrawberryPerl或ActivePerl下载并安装Perl。NASM(可选):如果你要编译支持x86......
  • C++进制转换
    这篇代码是我早就打出来的,当时放在百度网盘,本地放在硬盘上,后来硬盘坏了,最近清网盘的时候才想起来,所以赶紧改了改就发出来了这也是我比较早的代码了,所以记得并不清楚,改也只改了一点,当时不爱打注释,具体思路也忘得一干二净,所以直接把代码贴出来了(好像屁话有点多)Code:#include......
  • Centos Linux 7 搭建邮件服务器(postfix + dovecot)
    准备工作1.一台公网服务器(需要不被服务商限制发件收件的,也就是端口25、110、143、465、587、993、995不被限制),如有防火墙或安全组需要把这些端口开放2.一个域名,最好是comcnorg的一级域名3.域名备案(如果服务器是国外的则不需要备案)一、配置域名解析1.登录阿里云,找到云解......
  • Linux文件/目录权限管理
    系列文章目录`提示:仅用于个人学习,进行查漏补缺使用。1.Linux介绍、目录结构、文件基本属性、Shell2.Linux常用命令3.Linux文件管理4.Linux命令安装(rpm、install)5.Linux账号管理提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文......
  • Linux磁盘管理详解(实操、解决磁盘疑难杂症)
    本文详细介绍了Linux磁盘管理、讲解了磁盘操作,如查看与添加磁盘、分区(使用fdisk和parted)、格式化、挂载和卸载、挂载U盘。最后,重点讨论了LVM逻辑卷的优势和操作,如物理卷、卷组和逻辑卷的创建、扩容与缩容。目录        磁盘查看和分区       1、du查......