不适应美帝的饮食,当一只咸鱼在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 ...
随机推荐
- 自己动手修改Robotium代码(上)
Robotium作为Android自动化测试框架,还有许多不完善的地方,也不能满足测试人员的所有要求.那么,本文以四个实际中碰到的问题为例,介绍改动Robotium源码的过程. public bool ...
- H5新增标签
<!DOCTYPE html ><html><head><meta http-equiv="Content-Type" content=& ...
- python/numpy/tensorflow中,对矩阵行列操作,下标是怎么回事儿?
Python中的list/tuple,numpy中的ndarrray与tensorflow中的tensor. 用python中list/tuple理解,仅仅是从内存角度理解一个序列数据,而非数学中标量 ...
- C语言之浮点数
#include<stdio.h> int main(){printf("请分别输入身高的英尺和英寸," "如输入\"5 7\"表示5英尺 ...
- leetcode算法题3:分组,让每个组的最小者,相加之后和最大。想知道桶排序是怎么样的吗?
/* Given an array of 2n integers, your task is to group these integers into n pairs of integer, say ...
- Loadrunner手动编写包含事务、检查点、关联等元素的脚本实例
一.前言: 本文适合初学者,包含很多细节,包括 二.准备: 1.以虚拟机中的Linux系统作为服务器,开启bugfree服务. 2.以fiddler作为抓包工具,辅助脚本开发. 3.脚本流程:bugf ...
- ACM HDU Bone Collector 01背包
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 这是做的第一道01背包的题目.题目的大意是有n个物品,体积为v的背包.不断的放入物品,当然物品有 ...
- php XSS安全过滤代码
function remove_xss($val) { // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are ...
- Codeforces 558E A Simple Task
题意:给定一个字符串,以及m次操作,每次操作对字符串的一个子区间进行升序或降序排序,求m次操作后的串 考虑桶排,发现线段树可以模拟桶排的过程,所以对26个字母分别建立线段树即可 #include< ...
- 【new File(String Path)加载资源问题】
2017-12-17 15:07:38 [原创-wx] 一.我们在用IO流加载资源的时候,创建文件资源 1 File file = New File("String Path" ...