Linux下C 的编程--开发环境搭建与第一个程序


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

简介

    C++是一个功能强大而又应用广泛的计算机语言,就应用领域而言,几乎无所不在,因为有操作系统的地方就会有C++的存在,热门程序而言,也就仅次于C和Java.而C与C++又有天然的血缘关系。


    从事C++开发近两年,虽然开发的产品都是跨平台的,但个人直接接触到的编程工程还是更偏重于Windows平台(至少开发环境更多的是在Windows平台),而现在要自己独立地带领一个项目的开发,还是一个跨平台的项目,也就有必要到Linux下C++的编程有一个进行一个系统的学习和了解。


本系列记录自己在Linux平台下学习C++的一些总结和心得。希望与大家一起学习与成长!


在进行Linux下C++编程之前,先来了解几个重要的工具和概念:


GNU

在Linux下进行编程,GNU是你永远绕不开的一个概念,因为你处处都可以看到它,那它是一个什么东西呢?

GNU是GNU’s Not Unix的缩写,意思是GNU并不是Unix。那它是什么呢?其实它有多个含义:


GNU项目

    1984年,史托曼(Richard Stallman)开始GNU项目,这个项目的目的是创建一个自由、开放的UNIX操作系统(Free Unix)。但是建立一个操作系统谈何容易啊!而且在当时的 GNU 是仅有史托曼一个人单打独斗的,这实在太麻烦,但又不能放弃这个计划。于是史托曼反其道而行之:“既然操作系统太复杂, 我就先写可以在 Unix 上面运行的小程序,这总可以了吧?”基于这个想法, 史托曼便开始参考Unix上的现有软件,并依据这些软件的作用开发出具有相同功能的软件,并将其开源。后来越来越多的人知道免费好用的GNU软件,并且与付费的专利的性能差不了多少,使用GNU软件的人就越来多,GNU项目也逐步打开知名度。


    为了这个计划,他开始使用原本Unix上面跑的软件,并自行撰写功能与Unix原有专利软件相仿的软件。但不论是什么软件,都得要进行编译成为二进制档案(binary file)后才能够执行,因此他便开始撰写C语言的编译器,那就是现在相当有名的GNU C(gcc)!这个点相当的重要!这是因为C语言编译器版本众多,但都是专利软件,如果他写的C编译器够棒,效能够佳,那么将会大大的让GNU计划出现在众人眼前!


GNU自由软件协议

    GPL协议指的是通用公共许可证(General Public License, GPL)。由于GNU项目开发的软件都是开放源代码的自由软件,这就有可能被他人盗用并对它进行注册而成为专利软件。为解决这个问题,1985年史托曼与律师草拟了有名的通用公共许可协议,你可以在GNU软件源码的每一个文件(如.h、.cpp)开头看到这个协议的声明,如:


/*
 * Copyright (C) 2004-2010 Geometer Plus <contact@geometerplus.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 */


GPL协议的详细内容见http://www.gnu.org/licenses/gpl-3.0.en.html

关于GPL协议的几点说明如下:

你可以——

取得软件源码:你可以根据自己的需求执行GPL协议的自由软件;

复制:你可以自由复制该软件;

修改:你可以将取得的源码进行程序的修改,使之适合自己的工作;

再发行:你可以将你修改过的程序再度自由发行,而不会与原有的编写者冲突;

回馈:你可以你修改过的程序回馈于社会!

你不能——

修改授权:你不能将一个GPL授权的自由软件在你修改后将它取消GPL授权;

单纯销售:你不能单纯销售自由软件;


GNU开发的自由软件

前面说到史托曼开始GNU项目进行开发大量的自由软件,随着这些软件的成功开发和广泛使用,GNU的熟知度也越来越广。现在被广泛使用的知名的自由软件有:

Emacs

GCC(GNU Compiler Collection C程序编译器)、G++(C++编译器)

GNU C Library(GLIBC)

Bash Shell


GCC与G++

    首先GCC是the GNU Compiler Collection的意思,是GNU的一个编译器集合,里面包含了多种编译器及相关工具,如gcc、g++。GCC是多种主要编程语言编译器的整合(或叫集成)发布。这些编程语言目前包含C, C++, Objective-C, Objective-C++, Java, Fortran和Ada。参见Using the GNU Compiler Collection


    gcc是GNU的C编译器(GNU C Compiler),是GNU Compiler Collection的一部分;

g++是GNU的C++编译器(GNU C++ Compiler),也是GNU Compiler Collection的一部分;


GDB

    GDB是GNU Project的一个调试程序(GNU Debugger), 允许你查看一个程序执行时内部的具体执行逻辑,或当它崩溃时这个程序执行了什么。

    GDB可以做四个主要的事情(及它所支持的其它功能)以帮助你发现程序的bug:

1. 开始一个程序,指定任何可能影响它行为的事情;

2. 让你的程序以指定的条件暂停;

3. 当程序停止时检查发生了什么;

4. 改变你程序中的变量或数据,以便你试验导致你程序bug的影响因素,并了解更多其它的信息。


    GDB可以调试以下编程语言编写的程序:Ada、C、C++、Objective-C、Pascal等,这些程序可能执行在相同的机器上(本地调试),也可能执行在不同的机器中(远程调试),GDB可以运行在最爱欢迎的Unix和Microsoft Windows上。

参考阅读:The GNU Project Debugger


Makefile

    Makefile是程序编译的规则,makefile记录着整个工程的编译规则(如源文件的编译顺序、依赖关系等),通过make工具进行编译。make根据makefile定义的规则将源代码编译成二进行文件。在跨平台(特别是类Unix系统中)的程序中,一般都会通过makefile来进行编译。

开发工具的安装

环境

Distributions版本:CentOS 6.7

Linux内核片:2.6.32-573.3.1.el6.i686


一般Linux安装完之后默认就已经安装了GCC(GNU Compiler Collection),你可以查看一下gcc和g++的版本号检查gcc和g++是否已经安装。


[luowf@luoweifu ~]$ gcc -v

gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 

[luowf@luoweifu ~]$ g++ -v

gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 


如果未安装,在Linux系统链接网络的时候可通过以下命令安装开发工具集:


yum groupinstall "Development Tools"

1

第一个HelloWorld程序

说到程序,第一个肯定就是HelloWorld,那我们也从HelloWorld开始吧,写一个最简单的Hello程序,并编译和运行。


编写第一个程序

[luowf@luoweifu Cplusplus]$ pwd

/home/luowf/workspace/Cplusplus


//在vim中编写第一个HelloWorld程序

[luowf@luoweifu Cplusplus]$ vim HelloWorld.cpp

1 #include <iostream>
2 
3 int main()
4 {
5         std::cout << "Hello Wolrd!" << std::endl;
6         return 0;
7 }


//编译程序

[luowf@luoweifu Cplusplus]$ g++ HelloWorld.cpp 

[luowf@luoweifu Cplusplus]$ ls

a.out  HelloWorld.cpp  test1  test2

[luowf@luoweifu Cplusplus]$ ./a.out 

Hello Wolrd!

[luowf@luoweifu Cplusplus]$


g++与gcc的区别

    在上一篇文章中其实已经分别介绍了gcc和g++,说gcc是C的编译器,g++是C++的编译器。

    那是不是说gcc只能编译编译C语言,而g++只能编译C++呢?

    其实不是,gcc也可以编译C++程序,而C++是C的基础上发展而来的,所以g++也不可能编译不了C语言。它们之间的区别有如下几点:

1. 后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序。注意,虽然c++是c的超集,但是两者对语法的要求是有区别的,C++的语法规则更加严谨一些。

2. 编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。用gcc进行编译,在选项中加上要链接的库,也可以编译c++。如上面的HelloWorld程序我们也可以用以下的命令进行编译:


[luowf@luoweifu Cplusplus]$ gcc -lstdc++ HelloWorld.cpp

[luowf@luoweifu Cplusplus]$ ls

a.out  HelloWorld.cpp  test1  test2

[luowf@luoweifu Cplusplus]$ ./a.out 

Hello Wolrd!

[luowf@luoweifu Cplusplus]$ 


gcc不会定义__cplusplus宏,而g++会

这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

参考文章:http://www.linuxsky.org/doc/dev/200804/298.html


程序的编译及常用命令

将源代码编译成目标文件,不进行链接


gcc -c HelloWorld.cpp

在编译的时候,依据操作系统给予优化执行速度


gcc -O HelloWorld.cpp -c

1

将目标文件链接成二进行(可执行)文件


gcc -o HelloWorld HelloWorld.o -lstdc++

1

HelloWorld是可执行文件名,HelloWorld.o是目标文件名;如果是.c后缀的C源文件不用加-lstdc++,如果是.cpp后缀的C++源文件,要加-lstdc++。


在进行二进制文件制作时,将链接的函数库与相关的路径填入


(.cpp文件)gcc -lstdc++ HelloWorld.cpp

1


(.c文件)gcc HelloWorld.c -lm -L /usr/Lib -I /usr/include

1

说明:

-lm 指的是libm.so或libm.a这个函数库文件;

-L 后面接的路径是刚才上面那个函数库的搜索目录;

-I 后面的是源码内的include文件(也就是包含的math.h头文件)所在的目录;


HelloWorld.cpp代码如下:


1 #include <iostream>
  2 #include <math.h>
  3 
  4 int main()
  5 {
  6         std::cout << "Hello Wolrd!" << std::endl;
  7         float value = sin (3.14 / 2);
  8         std::cout << "value:" << value << std::endl;
  9         return 0;
 10 }

将编译链接的结果输出成某个特定的文件名


gcc -lstdc++ -o HelloWorld HelloWorld.cpp

1

helloWorld为输出的文件名


在编译的时候,输出较多的信息说明


gcc -lstdc++ -o HelloWorld HelloWorld.cpp -Wall

好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***