Linux(Ubuntu):如何进⾏c++编程
预备知识
安装vim:
  (针对Ubuntu,使⽤ apt 源安装 vim)apt-get install vim
  (针对 centos、redhat,使⽤ yum 源安装 vim)yum install vim
配置vim:
安装vim并配置  ~/.vimrc ⽂件使得vim能够⽀持语法⾼亮、⾃动缩进等等功能。⽬前使⽤的 vimrc 配置⽂件的内容如下,进⾏基本的 c/c++ 编程已经⾜够了(适⽤于类 UNIX 系统):
" 显⽰⾏号
set number
" 显⽰标尺
set ruler
" 历史纪录
set history=1000
" 输⼊的命令显⽰出来,看的清楚些
set showcmd
" 状态⾏显⽰的内容
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
" 启动显⽰状态⾏1,总是显⽰状态⾏2
set laststatus=2
" 语法⾼亮显⽰
syntax on
set fileencodings=utf-8,gb2312,gbk,cp936,latin-1
set fileencoding=utf-8
set termencoding=utf-8
set fileformat=unix
set encoding=utf-8
" 配⾊⽅案
colorscheme desert
" 指定配⾊⽅案是256⾊
set t_Co=256
set wildmenu
" 去掉有关vi⼀致性模式,避免以前版本的⼀些bug和局限,解决backspace不能使⽤的问题
set nocompatible
set backspace=indent,eol,start
set backspace=2
" 启⽤⾃动对齐功能,把上⼀⾏的对齐格式应⽤到下⼀⾏
set autoindent
" 依据上⾯的格式,智能的选择对齐⽅式,对于类似C语⾔编写很有⽤处
set smartindent
" vim禁⽤⾃动备份
set nobackup
set nowritebackup
set noswapfile
" ⽤空格代替tab
set expandtab
" 设置显⽰制表符的空格字符个数,改进tab缩进值,默认为8,现改为4
set tabstop=4
" 统⼀缩进为4,⽅便在开启了et后使⽤退格(backspace)键,每次退格将删除X个空格
set softtabstop=4
" 设定⾃动缩进为4个字符,程序中⾃动缩进所使⽤的空⽩长度
set shiftwidth=4
" 设置帮助⽂件为中⽂(需要安装vimcdoc⽂档)
set helplang=cn
" 显⽰匹配的括号
set showmatch
" ⽂件缩进及tab个数
au FileType html,python,vim,javascript setl shiftwidth=4
au FileType html,python,vim,javascript setl tabstop=4
au FileType java,php setl shiftwidth=4
au FileType java,php setl tabstop=4
" ⾼亮搜索的字符串
set hlsearch
" 检测⽂件的类型
filetype on
filetype plugin on
filetype indent on
" C风格缩进
set cindent
set completeopt=longest,menu
" 功能设置
" 去掉输⼊错误提⽰声⾳
set noeb
" ⾃动保存
set autowrite
" 突出显⽰当前⾏
set cursorline
" 突出显⽰当前列
set cursorcolumn
"设置光标样式为竖线vertical bar
" Change cursor shape between insert and normal mode in iTerm2.app
"if $TERM_PROGRAM =~ "iTerm"
let &t_SI = "\<Esc>]50;CursorShape=1\x7"" Vertical bar in insert mode
let &t_EI = "\<Esc>]50;CursorShape=0\x7"" Block in normal mode
"endif
" 共享剪贴板
set clipboard+=unnamed
" ⽂件被改动时⾃动载⼊
set autoread
" 顶部底部保持3⾏距离
set scrolloff=3
View Code
如果还想更舒服地编程,可以使⽤vim插件实现⾼级⾃动补全,快速定位、美化vim等等...那么最好先学习github的使⽤(如搜索廖雪峰的github教程),并在github上搜索 k-vim 并⼀键安装。
完整的编译并执⾏cpp⽂件过程
(⼀)代码编写
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(void)
{
std::cout << "hello, world" << endl;
return0;
}
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 是最常⽤的。当编写 C 或 C++ 程序时编译器警告⾮常有助于检测程序存在的问题。在最新⼏个版本的 g++ ⾥ -Wall 已是默认的选项,在编译时可⽆需再加⼊该选项,所以你也可以这么⽤:
g++ test.cpp
本例中,编译器使⽤了 -Wall 选项⽽没产⽣任何警告,因为⽰例程序是完全合法的。
linux下gcc编译的四个步骤另外:如果⼀开始建⽴了⼀个“test.c”的C语⾔类型的⽂件,内容如下;
#include <stdio.h>
int main(void)
{
printf("Hello, world!/n");
return0;
}
编译时使⽤“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!");
return0;
(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
$ 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);
return0;
}
尝试单独从该⽂件⽣成⼀个可执⾏⽂件将导致⼀个链接阶段的错误:
$ 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) is0.909297
可执⾏⽂件包含主程序的机器码以及函数库‘libm.a’中 sin 对应的机器码。
2. 法⼆
为避免在命令⾏中指定长长的路径,编译器为链接函数库提供了快捷的选项‘-l’。例如,下⾯的命令
$ gcc -Wall calc.c -lm -o calc
与我们上⾯指定库全路径‘/usr/lib/libm.a’的命令等价。
⼀般来说,选项 -lNAME使链接器尝试链接系统库⽬录中的函数库⽂件 libNAME.a。⼀个⼤型的程序通常要使⽤很多 -l 选项来指定要链接的数学库,图形库,⽹络库等。
如果想要使⽤c++11标准需要显⽰链接 -std=c++11,并保持 g++ 版本在4.8以上,如下
g++ test.cpp -std=c++11

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。