【C++】解析C++运行环境的搭建
在本篇文章中,笔者会谈谈如何搭建C++的运行环境。在不同操作系统中,运行C++编译器的命令也各不相同,最常用的编译器是GNU编译器(Linux系统)和微软Visual Studio编译器(Windows系统)。
注意C++是没有版本的说法的,只有编译C++的编译器才有版本这一说。C++常用的标准的是“C++11”和"C++98",其中“C++11”是目前最新的标准。如果是Linux系统,GCC的版本至少都应该是4.7才能支持c++11标准,而且4.7还未完全支持C++11标准的所有特性,只支持了C++11标准的部分特性,传送门。但是Windows系统中的至少是Visual Studio 2015才支持"C++11"标准。
Windows7 搭建运行环境
C++与C#不同,Windows中很多类库都是由C#写的,几乎所有的Windows操作系统默认都已经安装了.NET Framework了,可以直接使用C#的环境。但C++不同,需要先下载微软的Visual Studio,安装过程一路Next。这里笔者就不介绍如何使用它的图形界面了,本文介绍通过命令行工具来编译C++程序。visual studio有许多版本,但从visual studio 2012才开始部分支持c++11的特性,关于visual studio 各个版本与c++标准支持的对照表,传送门。
笔者的Visua Studio目录为:C:\Program Files (x86)\Microsoft Visual Studio 11.0
配置环境变量:
添加VS_HOME
C:\Program Files (x86)\Microsoft Visual Studio 11.0
添加LIB
%VS_HOME%\vc\lib
添加INCLUDE
%VS_HOME%\vc\include
Path环境变量追加:
%VS_HOME%\vc\bin
接下来测试一下:cl /?
然后编写一个Hello.cpp文件,内容如下:
//引入iostream
#include <iostream> int main(){
//提示用户输入
std::cout << "Enter two numbers:" << std::endl; int v1 = , v2 = ;
//接收两个数字,中间以空格隔开
std::cin >> v1 >> v2; //输出两个数的和
std::cout << "The sum of num " << v1 << " and " << v2 << " is " << (v1+v2) << std::endl; return ;
}
运行cl /EHsc Hello.cpp,会得到Hello.exe文件。其中/EHsc表示启用C++的异常处理,与/GX[-]相同。
读者可能会遇到如下错误:
1.出现vc编译,丢失mspdb110.DLL解决
这是因为%VS_HOME%\VC\bin\下没有mspdb110.dll“这个文件,直接从%VS_HOME%\Common7\IDE\下复制这个文件到%VS_HOME%\VC\bin\下即可解决。
2.无法打开文件“kernel32.lib”或缺少 “uuid.lib”
这是%VS_HOME%\VC\lib下没有这两个文件,在不同的计算机中这两个文件的位置也不一定是固定的。读者可以在C盘下搜索Kernal32.lib和uuid.lib,然后将它们拷贝到%VS_HOME%\VC\lib目录下。
Linux 下搭建运行环境
笔者的Linux是:CentOS-7.4-x64版本。
在上面我们介绍了如何在Windows下搭建和运行C++程序,在接下来的章节中,笔者将会探讨如何在Linux下搭建C++语言环境。
在开始搭建环境之前,需要先了解GCC的概念。GCC的全称是GNU Compiler Collection(GNU编译器集合),通过GNU编译器能够编译不同类型的语言。
gcc:GNU C Compiler
g++:GNU C++ Compiler
gcc编译.c或.cpp结尾的文件,但是gcc是分开编译C和C++的。g++也可以编译.c或.cpp文件,但这些文件都被作为C++进行编译。
也就是说,g++编译文件的时候,默认是会引入标准库(std)文件的,但是gcc不会。
1.安装GNU c/c++编译器
检查gcc和g++是否安装
gcc --version g++ --version
如果未安装,可以按照如下的提示进行一步步进行安装。
如果是Centos6系统:
# yum groupinstall 'Development Tools'
CentOs7系统,可能会找不到“Development Tools”包,可以用如下的命令:
# yum -y install gcc-c++
如果是Debian 或 Ubuntu 系统
$ sudo apt-get update
$ sudo apt-get install build-essential manpages-dev
2.验证
在Linux系统中,输入如下命令会显示GCC的安装位置和版本信息
$ whereis gcc
$ which gcc
$ gcc --version

如果是要使用C++11的特性,那么应该将GCC的版本升级到4.7以上,建议5.4的版本。
下面笔者介绍如何在CentOS7下,将GCC4.8升级到GCC5.4版本,可以参考如下脚本
echo "Downloading gcc source files..."
curl https://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.bz2 -O echo "extracting files..."
tar xvfj gcc-5.4.0.tar.bz2 echo "Installing dependencies..."
yum install gmp-devel mpfr-devel libmpc-devel -y echo "Configure and install..."
mkdir gcc-5.4.0-build
cd gcc-5.4.0-build
../gcc-5.4.0/configure --enable-languages=c,c++ --disable-multilib
make -j$(nproc) && make install
参考地址为:https://gist.github.com/jdhao/e3fd77d51f3a95684d2b3354fc61b2ab
3.在Linux系统上编译和运行C/C++项目
接下来笔者写些C和C++的案例文件,并且在Linux系统编译和运行起来。
demo.c
#include<stdio.h>
/* demo.c: My first C program on a Linux */
int main(void)
{
printf("Hello! This is a test prgoram.\n");
return ;
}
编译命令可以用cc、gcc、make:
cc demo.c -o demo
或
gcc demo.c -o demo
或
make demo
注意:在使用make编译的时候,不用指定源文件,只需要制定源文件去掉后缀后的新的文件,就可以了。例如上面的demo.c,只要使用make demo, make就会根据规则,将demo.c编译为demo。
执行上面三个命令的任何一个,都可以生成一个名为demo的可运行文件。
然后使用
./demo
就可以运行了。
效果图:

接下来我们来编译和运行一下C++程序。
还是以上面的Hello.cpp(这里不再重复贴出代码,就是第一节中“Windows7 搭建运行环境”下的案例)为例,我们可以如下编译
g++ Hello.cpp -o Hello
或者
make Hello
注意这里不能使用 gcc Hello.cpp -o Hello 来编译(如果使用该命令编译,那么报出“找不到标准库”的错误),因为gcc命令默认是编译C语言文件的,未引入标准库。
然后运行就可以了
./Hello
如果使用了g++11的特性的话,那么应该指明使用g++11标准进行编译:
g++ Hello.cpp -o Hello -std=c++
如果make使用的时候,出现target is up to date错误信息,那么可以加上-B 选项,例如:
make -B Hello
参考文档:
How To Compile And Run a C/C++ Code In Linux
What is the difference between g++ and gcc?
【C++】解析C++运行环境的搭建的更多相关文章
- Java开发和运行环境的搭建
Java开发需要准备的东西? JDK+Eclipse 其中JDK的意思是Java开发工具包,Eclipse是进行用于做Java程序开发的工具(当然你也可以用记事本什么的去做). 其他开发工具:JCre ...
- SAAS云平台搭建札记: (二) Linux Ubutu下.Net Core整套运行环境的搭建
最近做的项目,由于预算有限,公司决定不采购Windows服务器,而采购基于Linux的服务器. 一般的VPS服务器,如果使用Windows系统,那么Windows Server2012\2016安装好 ...
- 《算法》第四版 IDEA 运行环境的搭建
<算法>第四版 IDEA 运行环境的搭建 新建 模板 小书匠 在搭建之初,我是想不到会出现如此之多的问题.我看了网上的大部分教程,都是基于Eclipse搭建的,还没有使用IDEA搭建的教程 ...
- 关于 vue.js 运行环境的搭建(mac)
由于本人使用的是mac系统,因此在vue.js 的环境搭建上遇到许许多多的坑.感谢 showonne.yubang 技术指导,最终成功解决.下面是个人的搭建过程,权当是做个笔记吧. 由于mac非常人性 ...
- MySQL数据库运行环境的搭建
第一步:安装wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b文件,安装过程中可能会遇到问题,把遇到的问题代码复制粘贴到360人工服务,查找方案 ...
- Windows 2008下系统网站运行环境的搭建
1.右击[计算机]-->[管理],进入到”服务器管理器” 界面,如图所示: 2.依次展开[角色]-->[Web服务器(IIS)]-->[Internet 信息服务(IIS)管理器], ...
- Windows Server 2012上PHP运行环境搭建的简易教程(Win08适用)
微软的Windows Server 2012发布后,第一时间进行了简单的试用,非常不错,特写了个简易的PHP环境搭建教程.先来欣赏下Win2012的登录界面吧第一步我们需要安装IIS81.点击任务栏最 ...
- Windows上搭建Kafka运行环境
完整解决方案请参考: Setting Up and Running Apache Kafka on Windows OS 在环境搭建过程中遇到两个问题,在这里先列出来,以方便查询: 1. \Jav ...
- .net core 2.0学习笔记(一):开发运行环境搭建
期待已久的.net core 2.0终于发布了!大家等的花儿都谢了. 不过比预期提前了一个多月,这在微软历史上还真的不多见.按照历史经验看,2.0版本应该比较靠谱,我猜这也是社区非常火爆的原因吧.下面 ...
随机推荐
- 给力的移动 FZU - 2287
你的弟弟给你安排了一个任务,他给了你1到N个数字的乱序排列,现在你想给你的弟弟秀一波操作,操作最少的次数把序列变成1到N的顺序排列,每次操作你可以选择序列中的一个数字并把它移动到序列的头部或尾部. I ...
- POJ 1258 Agri-Net 【Prime】模板题
题目链接>>> 题目大意: 给你N*N矩阵,表示N个村庄之间的距离.FJ要把N个村庄全都连接起来,求连接的最短距离(即求最小生成树).解析如下: #include <c ...
- vue-router那些事儿
vue-router适用于单页面应用. 一.vue-router的引用方法1.用script标签 <script src="https://unpkg.com/vue-router/d ...
- emacs 入门教程,菜单汉化,配置文件等杂乱文章
首先来一发ArchWiki的Emacs简体中文的入门教程 https://wiki.archlinux.org/index.php/Emacs_(%E7%AE%80%E4%BD%93%E4%B8%AD ...
- 考前停课集训 Day3 匪
Day3——作死不可活的一天 Day3 今天下午才考 晚上时间少 下午网每断 因此我是PY的 然后被抓了 成绩做0分处理. 是啊,我只会抄题解. 其他什么都不会. 一无是处. 真的. 真实能力:ran ...
- WC前的小计划
写在前面的.. 要去WC了好开心的呢.. 但是之前荒废了好多时间呢.. 好吧从明天开始加紧训练,目标是:WC前bzoj300t..(现在是260呢..) 开始吧 来看看完成情况: 40/40 [201 ...
- Cow Acrobats [POJ3045] [贪心]
Description 农夫的N只牛(1<=n<=50,000)决定练习特技表演. 特技表演如下:站在对方的头顶上,形成一个垂直的高度. 每头牛都有重量(1 <= W_i <= ...
- mysql的基本查询(等于,不等于,between...and...,)
单个字段多个字段查询 查询员工姓名 *注:在SQL语句中不区分大小写:SQL语句以“:”分号结束 select ename from emp; 注:select询句后面跟的是字段名称,select是关 ...
- C# 哈希表HashTable的简单使用
本人C#程序菜鸟级别的存在,写博客一方面是为了知识的共享,另一方面也是为了督促自己:大神,可以忽略这篇文文的.废话到此...... 哈希表是可以直接进行访问的数据结构,在形式上是类似字典的.不同的是, ...
- Hadoop2之NameNode HA详解
在Hadoop1中NameNode存在一个单点故障问题,如果NameNode所在的机器发生故障,整个集群就将不可用(Hadoop1中虽然有个SecorndaryNameNode,但是它并不是NameN ...