不适应美帝的饮食,当一只咸鱼在apartment里Coding一波,学习学习如何在Ubuntu实现C++的编程
正文如下:
(预备知识)
学习Vim: http://www.cnblogs.com/starspace/archive/2009/05/15/1458044.html
配置Vim: http://haohetao.javaeye.com/blog/690715
总结: 安装vim --> 配置 /etc/vim/vimrc 文件 使得vim能够支持语法高亮、自动缩进等等功能。木目前使用的 vimrc 配置文件的内容如下,进行基本的 c/c++ 编程已经足够了。
++++++++++++++++++++++++++++++++++
"语法高亮显示
syntax enable
syntax on
set background=dark
set nocompatible
set number
"检测文件的类型
filetype on
"记录历史的行数
set history=1000
set cursorline
"set autoindent
set cindent
"设置C/C++语言的具体缩进方式
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
set smartindent
set expandtab " 使用空格代替tab.
set ts=4 "空格数量
set shiftwidth=4 "自动缩进的宽度
set showmatch
set cursorline
set nobackup
" just for encode
set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set fileformats=unix
set encoding=prc
set hlsearch "高亮显示所有匹配
" set foldmethod
set fdm=indent "代码折叠
if &term=="xterm"
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif
+++++++++++++++++++++++++++++++++++++++
vim的功能相当强大,各人可以根据自己的需求DIY这个vimrc文件,完全可以制造出非同寻常的效果来,可以参见如下内容:
http://blog.csdn
.NET/wooin/archive/2007/10/31/1858917.aspx
(一)代码编写
1。启动终端;
2。输入vim test.cpp,新建了一个文件叫做“test.cpp”;如果以前已经建立过这个文件,则是打开这个名字的文件。
3。默认进入的是命令模式,输入 i、a、o等进入编辑插入模式,分别对应于当前位置之前、之后插入和插入一行。
如果要删除当前正在编辑的那一行的内容(删除一个字符,删除一个字,删除一行),则必须按下esc键回到命令模式,分别使用x(删除一个字符)、dw(删除一个字)、dd(删除一行)来进行删除。
如果要撤销某此操作,回到命令模式,然后输入命令u(undo)来撤销操作;如果要恢复撤销的内容,则在命令模式下,输入命令":redo"或者是":Control键+r",在没有设置compatible的情况下,可以作多次的撤销和恢复;
4。编辑结束,输入":w"表明存盘,然后输入“:q”退出vim编辑器;也可以直接输入“:wq”直接完成这两个步骤。
(二)代码编译运行
设“test.cpp”文件的内容是:
#include <iostream>
int main(int argc,char *argv[])
{
std::cout << "hello, world/n";
return 0;
}
1。 对于这个.cpp文件,使用以下的命令进行文件的编译:
gcc -Wall test.cpp -o test -lstdc++ (必须加上 -lstdc++ 选项用来通知链接器链接静态库 libstdc++.a,否则会因为找不到库函数而出错)
或者直接使用编译c++(.cpp)文件专用的命令g++,如下:
g++ -Wall test.cpp -o test
==============
该命令将文件‘test.cpp’中的代码编译为机器码并存储在可执行文件 ‘test’中。机器码的文件名是通过 -o 选项指定的,该选项通常作为命令行中的最后一个参数。如果被省略,输出文件默认为 ‘a.out’。
注意到如果当前目录中与可执行文件重名的文件已经存在,则它将被复盖。
选项 -Wall 开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。编译器有很多其他的警告选项,但 -Wall 是最常用的。默认情况下GCC/G++不会产生任何警告信息。当编写 C 或 C++ 程序时编译器警告非常有助于检测程序存在的问题。
本例中,编译器使用了 -Wall 选项而没产生任何警告,因为示例程序是完全合法的。
另外:如果一开始建立了一个“test.c”的
C语言类型的文件,内容如下;
#include <stdio.h>
int main(void)
{
printf("Hello, world!/n");
return 0;
}
编译时使用“gcc -Wall test.c -o testc”命令。另外必须注意的是,在c文件中不能出现c++的库,比如#include <iostream.h>就会报错,但是cpp文件包含c语言的库却是可以的。
==============
2. 运行:
$ ./test
==============
这个命令将可执行文件载入内存,并使 CPU 开始执行其包含的指令。 路径“./”指代当前目录,因此“./test” 载入并执行当前目录下的可执行文件 ‘test’。
==============
运行结果为:hello, world
(三)编译多个源文件
1. 多源文件文件示例
将上面的"test.cpp"分解为三个不同的文件‘main.cpp’、‘test_fn.cpp’和头文件‘test.h’。
(1)主程序‘main.cpp’如下:
#include "test.h"
int main()
{
test("hello world!");
return 0;
}
(2)函数声明文件"test.h"如下内容:
void test(const char* name);
(3)函数实现文件"test_fn.cpp"的内容如下:
#include <iostream>
using namespace std;
#include "test.h"
void test(const char* name)
{
cout<<"Hello World!"<<endl;
}
2. 多文件编译
g++ -Wall main.cpp test_fn.cpp -o newTest
=====================
本例中,我们使用选项 -o 为可执行文件指定了一个不同的名字 newTest。注意到头文件‘test.h’并未在命令行中指定,这是因为它已经在main.cpp中包含。
=====================
(四)简单的makeFile文件
make命令 从 makefile(默认是当前目录下的名为‘makefile’的文件)中读取项目的描述。makefile指定了一系列目标(比如可执行文件)和依赖(比如对象文件和源文件)的编译规则,其格式如下:
目标: 依赖
命令
对每一个目标,make 检查其对应的依赖文件修改时间来确定该目标是否需要利用对应的命令重新建立。注意到,makefile 中命令行必须以单个的 TAB 字符进行缩进,不能是空格(纠正:就是空格而不是TAB)。
GNU Make 包含许多默认的规则(参见隐含规则)来简化 makefile 的构建。比如说,它们指定‘.o’文件可以通过编译‘.c’文件得到,可执行文件可以通过将‘.o’链接到一起获得。隐含规则通过被叫做make变量的东西所指定,比如 CC(C 语言编译器)和 CFLAGS(C程序的编译选项);在makefile文件中它们通过独占一行的 变量=值 的形式被设置。对 C++ ,其等价的变量是CXX和CXXFLAGS,而变量CPPFLAGS则是编译预处理选项。
1. 现在为上面的“编译多个源文件”示例创建一个简单的makefile文件,内容如下:
CXXC=g++
CXXFLAGS=-Wall
newTest: main.o test_fn.o (使用了隐含规则 cpp-->o)
clean: rm -f newTest main.o test_fn.o
===================
该makefile文件可以这样来读:使用 C++语言编译器 g++,和编译选项‘-Wall’,从对象文件‘test.o’和‘test_fn.o’生成目标可执行文件 newTest(文件‘test.o’和‘test_fn.o’通过隐含规则分别由‘test.c’和‘test_fn.c’生成)。目标clean没有依赖文件,它只是简单地移除所有编译生成的文件。rm命令的选项 ‘-f’(force) 抑制文件不存在时产生的错误消息。
===================
2. 要使用该 makefile 文件,输入 make命令。不加参数调用make时,makefile文件中的第一个目标被建立,从而生成可执行文件‘newTest’,终端会有如下输出:
$ make
g++ -Wall -c -o main.o main.cpp
g++ -Wall -c -o test_fn.o test_fn.cpp
g++ main.o test_fn.o -o newTest
运行该可执行文件:
$ ./newTest
Hello, world!
3. 一个源文件被修改要重新生成可执行文件,简单地再次输入 make 即可。通过检查目标文件和依赖文件的时间戳,程序 make 可识别哪些文件已经修改并依据对应的规则更新其对应的目标文件:
$ vim test.cpp (若打开编辑器修改一下test.cpp文件)
$ make (重新make)
g++ -Wall -c -o test.o test.c (此时只make该被修改的文件test.cpp)
g++ test.o test_fn.o -o newTest
运行:
$ ./newTest
Hello, world!
4. 最后,移除 make 生成的文件,输入“make clean”,显示如下:
$ make clean
rm -f hello hello.o hello_fn.o
总结: makefile文件类似一个编译连接程序的批处理文件,所有的命令要作的事情写进一个叫做makefile的文件中,然后使用make命令可以执行这个类似批处理文件的文件makefile。一个专业的 makefile文件通常包含用于安装(make install)和
测试(make check)等额外的目标。
本例子中涉及到的例子都足够简单以至于可以完全不需要makefile,但是对任何大些的程序都使用 makefile文件是很有必要的。
(五)链接外部库
库是预编译的目标文件(object files)的集合,它们可被链接进程序。静态库以后缀为‘.a’的特殊的存档文件(archive file)存储。
标准系统库可在目录 /usr/lib 与 /lib 中找到。比如,在类 Unix 系统中 C 语言的数学库一般存储为文件 /usr/lib/libm.a。该库中函数的原型声明在头文件 /usr/include/math.h 中。C 标准库本身存储为 /usr/lib/libc.a,它包含 ANSI/ISO C 标准指定的函数,比如‘printf’。对每一个 C 程序来说,libc.a 都默认被链接。
下面的是一个调用数学库 libm.a 中 sin 函数的的例子,创建文件calc.c:
#include <math.h>
#include <stdio.h>
int
main (void)
{
double x = sin (2.0);
printf ("The value of sin(2.0) is %f/n", x);
return 0;
}
尝试单独从该文件生成一个可执行文件将导致一个链接阶段的错误:
$ gcc -Wall calc.c -o calc
/tmp/ccbR6Ojm.o: In function 'main':
/tmp/ccbR6Ojm.o(.text+0x19): undefined reference to ‘sin’
函数 sin,未在本程序中定义也不在默认库‘libc.a’中;除非被指定,编译器也不会链接‘libm.a’。
1. 法一
为使编译器能将 sin 链接进主程序‘calc.c’,我们需要提供数学库‘libm.a’。一个容易想到但比较麻烦的做法是在命令行中显式地指定它:
$ gcc -Wall calc.c /usr/lib/libm.a -o calc
函数库‘libm.a’包含所有数学函数的目标文件,比如sin,cos,exp,log及sqrt。链接器将搜索所有文件来找到包含 sin 的目标文件。一旦包含 sin 的目标文件被找到,主程序就能被链接,一个完整的可执行文件就可生成了:
$ ./calc
The value of sin(2.0) is 0.909297
可执行文件包含主程序的机器码以及函数库‘libm.a’中 sin 对应的机器码。
2. 法二
为避免在命令行中指定长长的路径,编译器为链接函数库提供了快捷的选项‘-l’。例如,下面的命令
$ gcc -Wall calc.c -lm -o calc
与我们上面指定库全路径‘/usr/lib/libm.a’的命令等价。
一般来说,选项 -lNAME使链接器尝试链接系统库目录中的函数库文件 libNAME.a。一个大型的程序通常要使用很多 -l 选项来指定要链接的数学库,图形库,网络库等。
经实践,发现上述方法能够配置基本的gcc,但是无法满足-std=c++11(C++11标准),启动-std=c++11方法如下
- Linux多线程服务端编程一些总结
能接触这本书是因为上一个项目是用c++开发基于Linux的消息服务器,公司没有使用第三方的网络库,卷起袖子就开撸了.个人因为从业经验较短,主 要负责的是业务方面的编码.本着兴趣自己找了这本书.拿到书就 ...
- 《Linux 多线程服务端编程:使用 muduo C++ 网络库》电子版上市
<Linux 多线程服务端编程:使用 muduo C++ 网络库> 电子版已在京东和亚马逊上市销售. 京东购买地址:http://e.jd.com/30149978.html 亚马逊Kin ...
- 《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册
<Linux多线程服务端编程:使用muduo C++网络库>这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错 ...
- Linux下TCP网络编程与基于Windows下C#socket编程间通信
一.linux下TCP网络编程基础,需要了解相关函数 Socket():用于套接字初始化. Bind():将 socket 与本机上的一个端口绑定,就可以在该端口监听服务请求. Listen():使s ...
- Linux下的C编程实战
Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来, Linu ...
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- linux下的c编程
linux下的c编程 Linux 系统上可用的 C 编译器是 GNU C 编译器, 它建立在自由软件基金会的编程许可证的基础上,因此可以自由发布.GNU C 对标准 C 进行一系列扩展,以增强标准 ...
- Linux基础与Linux下C语言编程基础
Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...
- LINUX下C语言编程基础
实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...
- Linux守护进程的编程实现
Linux 守护进程的编程方法 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程.Linux的大多数s ...
随机推荐
- vue 项目中实用的小技巧
# 在Vue 项目中引入Bootstrap 有时在vue项目中会根据需求引入Bootstrap,而Bootstrap又是依赖于jQuery的,在使用npm按照时,可能会出现一系列的错误 1.安装jQu ...
- Python argparse模块实现模拟 linux 的ls命令
python 模拟linux的 ls 命令 sample: python custom_ls.py -alh c:/ 选项: -a ,--all 显示所有文件,包括'.'开头的隐藏文件 -l 列表显 ...
- 【Win 10 应用开发】UI Composition 札记(八):用 XamlLight 制作灯光效果
前面老周已介绍过灯光的使用,如果你忘了,请用九牛二虎之力猛点击这里去复习一下.本篇老周再介绍另一种添加灯光的方法,这种方法是专为 XAML 元素而设计的,可以很方便地为可视化元素添加灯光效果. 不知道 ...
- SpringMVC 表单验证
SpringMVC 表单验证 本章节内容很丰富,主要有基本的表单操作,数据的格式化,数据的校验,以及提示信息的国际化等实用技能. 首先看效果图 项目结构图 接下来用代码重点学习SpringMVC的表单 ...
- Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”
子类重新实现父类的方法称重写:重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改:仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类:要么就不修改 ...
- SQL学习入门(一) 概述
从事开发也有一段时间了,期间接触SQL也挺长时间了.许多东西也不是理解的特别深刻,所以写写随笔总结归纳一下. 如有不对的地方,欢迎指正! 一.认识SQL (1) 什么是SQL? 1.SQL 指结构化查 ...
- PendingIntent、Notification常用方法
PendingIntent PendingIntent它的直译是:待处理意图,这样翻译,大家就猜出它的作用是什么了,用于处理一些定义但是不立即使用的意图,最常见的就是用户点击通知,然后跳转指定的页面: ...
- C++ sqlite3解决中文排序问题
导言:sqlite3默认的编码方式为UTF8编码,而在UTF8编码下,中文不是按照拼音顺序编码的,所以想解决中文排序问题,必须自定义排序规则,将UTF8编码转换成GB2312编码(GB2312编码中文 ...
- 0:A+B Problem-poj
0:A+B Problem 总时间限制: 1000ms 内存限制: 65536kB 描述 Calculate a + b 输入 Two integer a,,b (0 ≤ a,b ≤ 10) 输出 ...
- Libevent 事件管理和添加事件
/** 我们先来看一下事件的创建*/struct event * event_new(struct event_base *base, evutil_socket_t fd, short even ...