程序员三大浪漫之编译器:如何编译和运行c 程序
目录
C++编译是什么
C++源文件的后缀
g++ 命令
而gcc的-lstdc++命令又是什么?
GCC中 -I、-L、-l 选项的作用
C++编译是什么
C++ 和C语言类似,也要经过编译和链接后才能运行。在《C语言编译器》专题中我们讲到了 VS、Dev C++、VC 6.0、Code::Blocks、C-Free、GCC、Xcode 等常见 IDE 或编译器,它们除了可以运行C语言程序,还可以运行 C++ 程序,步骤是一样的,这里不再赘述,读者需要留意的是 C++ 源文件的后缀,以及 GCC 中的g++
命令。
下图是 C/C++ 代码生成可执行文件的过程:
C++源文件的后缀
C语言源文件的后缀非常统一,在不同的编译器下都是.c
。C++ 源文件的后缀则有些混乱,不同的编译器支持不同的后缀,下表是一个简单的汇总:
编译器 | Microsoft Visual C++ | GCC(GNU C++) | Borland C++ | UNIX |
---|---|---|---|---|
后缀 | cpp、cxx、cc | cpp、cxx、cc、c++、C | cpp | C、cc、cxx |
UNIX 是昂贵的商业操作系统,初学者几乎用不到;Microsoft Visual C++ 是微软的 C/C++ 编译器,VC 6.0、VS 都使用该编译器。我推荐使用.cpp
作为 C++ 源文件的后缀,这样更加通用和规范。
g++ 命令
有了C语言开发经验,在 VS、Dev C++、VC6.0、C-Free、Xcode 等常见 IDE 下编译 C++ 程序易如反掌,只要把源文件的后缀设置为.cpp
即可,相信各位读者都能够毫无障碍地驾驭。本节我们重点介绍 Linux GCC 的使用。
在C语言中,我们使用gcc
命令来编译和链接C程序。例如编译单个源文件:
gcc main.c
编译多个源文件:
gcc main.c module.c
编译C++程序时,gcc
命令也可以使用,不过要增加-lstdc++
选项,否则会发生链接错误。例如编译单个源文件:
gcc main.cpp -lstdc++
编译多个源文件:
gcc main.cpp module.cpp -lstdc++
gcc
命令在链接时默认使用C的库,只有添加了-lstdc++
选项才会使用 C++ 的库。
不过 GCC 中还有一个g++
命令,它专门用来编译 C++ 程序,广大 C++ 开发人员也都使用这个命令。g++
命令和gcc
命令的用法如出一辙,例如编译单个源文件:
g++ main.cpp
编译多个源文件:
g++ main.cpp module.cpp
使用-o
选项可以指定可执行文件的名称:
g++ main.cpp -o demo
./demo
要想理解g++
命令,我们得从 GCC 的历史谈起。GCC 是由 GUN 组织开发的,最初只支持C语言,是一个单纯的C语言编译器,后来 GNU 组织倾注了更多的精力,使得 GCC 越发强大,增加了对 C++、Objective-C、Fortran、Java 等其他语言的支持,此时的 GCC 就成了一个编译器套件(套装),是所有编译器的总称。
在这个过程中,gcc
命令也做了相应地调整,它不再仅仅支持C语言,而是默认支持C语言,增加参数后也可以支持其他的语言。也就是说,gcc
是一个通用命令,它会根据不同的参数调用不同的编译器或链接器。
但是让用户指定参数是一种不明智的行为,不但增加了学习成本,还使得操作更加复杂,所以后来 GCC 又针对不同的语言推出了不同的命令,例如g++
命令用来编译 C++,gcj
命令用来编译 Java,gccgo
命令用来编译Go语言。
在以后使用 Linux GCC 时,我推荐使用g++
命令来编译 C++ 程序,这样更加简洁和规范。
而gcc的-lstdc++命令又是什么?
我们先看看std是什么意思?如下,暂时理解为:Standard的意思
用GCC编译代码时候后面带有-std=c++1z 的选项,这是指定c/c++的标准.具体的标准如下,详细信息可以看引用里面的详细说明
stand descript
-std=c90 or -std=iso9899:1990 称为C89或C90
-std=iso9899:199409 称为C94或C95
-std=c99 or -std=iso9899:1999. 1999年发布的 ISO/IEC 9899:1999,称为C99
-std=c11 or -std=iso9899:2011 称为C11
-std=gnu90 C90和GNU扩展
-std=gnu99 C99和GNU扩展
-std=gnu11 C11和GNU扩展
而-l是什么意思?如下,小写的l (e_lou),理解为:指定库的意思
GCC中 -I、-L、-l 选项的作用
-I (注意是大写的i) 给gcc添加自定义的头文件的路径
-L 给gcc添加额外的搜索库的路径
-l(小写的L) 给gcc 指定具体的库
所以-lstd c++ 串起来就是,指定c++标准作为标准编译器