Ubuntu 14.04使用GCC相关

Ubuntu 14.04安装使用GCC相关

准备工作:

  1. 已经安装好的Ubuntu 14.04系统
    我用的ubuntukylin-14.04.5-enhanced-amd64
  2. 可以正常连接互联网的网络环境
  3. 脑子

1. 确认手上的工具

1.1 是否安装了vim

1.1.1 输入vim -v查看vim版本
如果显示

程序 'vim' 已包含在下列软件包中:
 * vim
 * vim-gnome
 * vim-tiny
 * vim-athena
 * vim-gtk
 * vim-nox
请尝试:sudo apt-get install <选定的软件包>


说明vim尚未安装,输入以下命令安装vim(vim-gtk是自带语法高亮的版本)。

sudo apt-get install vim-gtk

或者直接使用大佬的配置
spf13
NeoVIM
exVIM

1.1.2 安装完成后再次输入vim -v验证


出现上图才说明已经成功安装vim,ESC进入命令模式输入:q然后按回车退出vim。

1.2 配置vim

1.2.1 先测试语法高亮是否正常
touch一个c文件随便写点东西

回忆了半天c怎么写|д` )

可以看到即使没有任何额外配置,已经有语法高亮了√。

1.2.2 配置vim
然而只有语法高亮远远不够用,输入以下命令修改配置文件

sudo vim /etc/vim/vimrc


syntax on就是语法高亮,如果你的是off请改成on。
另外把光标移到文件末尾,输入以下配置(根据自己需要选择)

colorscheme desert
" 设置配色为沙漠
" 其他可选: torte, solarized, molokai, phd, ron, evening等
set mouse=a " 设置可用鼠标点击移动光标
set nu " 显示行号
set nobackup " 覆盖文件时不备份
set autowrite " 自动保存
set cursorline " 高亮显示当前行
set tabstop=4 " 设置tab长度为4个空格
set softtabstop=4 " 设置软tab长度为4个空格
set shiftwidth=4 " 设置缩进为4个空格
set expandtab " 将tab替换为空格
set autoindent " 设置自动缩进(对齐上一行)
set smartindent " 设置智能缩进
set cindent " 设置c语言的缩进方式
set showmatch " 自动匹配
set ruler " 在右下角显示当前行信息
set incsearch " 搜索加强
set hlsearch " 搜索高亮
set ignorecase " 搜索忽略大小写
set whichwrap=b,s,<,>,[,] " 光标从行首和行末时可以跳到另一行去
set scrolloff=3 " 光标移动到上下两端时保持3行距离
set history=1000 " 历史记录条数从20到1000

最后:wq保存并退出,像下面这样


配置后编辑文件效果

这里看起来似乎比起之前的图好像就多了左边的行号其他没什么区别,但是好处要自己写了才知道。

1.3 补充插件

安装自动完成插件

sudo apt-get install vim-youcompleteme

然后还要用插件管理器把插件安进vim才能生效

vam install youcompleteme

如果这里失败可能是因为插件管理器尚未安装。
尝试sudo apt-get install vim-addon-manager


2. 开始干活

理论上说ubuntu应该自带gcc,可能没安g++。

如果需要安装g++最好别单独安装g++。
为了能够编译Ubuntu的内核,Ubuntu提供了一个build-essential软件包。
查看依赖关系可以看到以下内容

$ apt-cache depends build-essential
build-essential
依赖: libc6-dev
依赖: libc6-dev
依赖: gcc
依赖: g++
依赖: make
依赖: dpkg-dev

也就是说,安装了该软件包,编译c/c++所需要的软件包也都会被安装

apt-cache depends build-essential

然后g++ --version可以看到一步到位了。

gcc编译C文件一共分为四步:

  1. 预处理 (Preprocess) :生成.i文件
  2. 编译 (Compilation) :生成.s文件
  3. 汇编 (Assembly) :生成.o文件
  4. 链接 (Linking) :生成可执行文件
2.1 预处理 (Preprocess)

预处理会做两件事情:
第一,把除了函数之外的东西全部展开成指定的形式。
第二,删掉文件里的所有注释

展开成指定形式是什么形式?
展开以#起始的行,包括#if#ifdef#ifndef#else#elif#endif#define#include#line#error#pragma以及单独的#
另外还有加上行号等工作,并将头文件里包含的东西所对应的文件(包括子文件夹)也都写入进去以便调用。

至于为什么要删注释——
此时代码已经算进入底层了:
一方面是,对底层来说无用的注释留下来只会影响之后编译汇编等过程的效率;
另一方面是,这时候还不删注释是指着留到后面看能不能帮人家反编译吗。

执行以下命令可以得到仅预处理后的test.i文件(当然你要先写一个test.c)

gcc -E test.c -o test.i

用vim打开test.i后可以看到多加了成百上千行,都是预处理做的事情。

-E仅激活预处理程序,并将生成的信息放入test.i。

2.2 编译 (Compilation)

编译的作用就是把预处理完的文件进行一系列语法分析及优化后生成相应的汇编文件。
执行以下命令可以得到编译后的test.s汇编文件(同上,当然你要先有一个test.i)

gcc -S test.i -o test.s

用vim打开test.s后可以看到源代码已经面目全非了,变成了一条条的汇编指令。

2.3 汇编 (Assembly)

汇编就是把拿到的汇编指令逐条翻译成机器可以识别的形式,即机器码。

这一步会产生平台相关性,即决定了在何种平台下运行。

执行以下命令可以得到编译后的test.o文件(同上,当然你要先有一个test.s)

gcc -c test.s -o test.o

用vim打开是乱码,改成16进制显示可以看到是什么数字,但毕竟原本还是二进制,还要经过翻译才能变成机器码。

注意!
执行以下命令会生成onestep.o

gcc test.c -o onestep.o

而「onestep.o」跟「test.o」区别是很大的,就算源代码test.c一模一样。
「test.o」不可以直接执行,而「onestep.o」可以直接执行。
这是因为test.o为可重定位文件,还需要经过最后一步链接才能变成可执行文件。
一步到位的onestep.o已经完成了链接变成可执行文件了。
也就是说:
分步完成的「test.o」还要经过一道链接的工序才能变成「onestep.o」。

2.4 链接 (Linking)

将生成的目标文件和其所依赖的库文件进行连接,生成一个(包装好的)可执行文件。
(不是onestep.o那种半成品)

有兴趣可以试试按生成onestep.o的方式生成一个onestep.o,然后把后缀名 .o 改成 .out 看看是什么效果。

执行以下命令可以得到完成品「THE·可执行文件·test

gcc test.o -o test

执行以下命令可以执行这个文件

./test

至此gcc从编译到执行就完成了。

2.5 代码含义及示例
-o:指定生成的输出文件。
-E:仅执行编译预处理。
-S:将C代码转换为汇编代码。
-wall:显示警告信息,把警告信息当作错误输出。
-c:仅执行编译操作,不进行连接操作。
//一般过程
gcc -o main main.c
./main
//一般过程的另一种写法
gcc main.c -o main
./main
//总之 -o 后面一定紧接的是 [生成的文件名]
//多个源文件的一般过程
gcc -o main main.c other.c
./main
//分步过程
gcc -c main.o main.c
gcc -o main main.o
./main
//多个源文件的分步过程
gcc -c main.o main.c
gcc -c other.o other.c
gcc -o main main.o other.o
./main

3. gdb的调试

摸了
明年再说


4. makefile的使用

摸了
后年再说


5. 其他

一串神秘的代码,用法:写在.vimrc里面

" 按F5一键编译并运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
        exec "w"
        if &filetype == 'c'
           exec "!g++ % -DLOCAL -o   %<"
           exec "!time ./%<"
        elseif &filetype == 'cpp'
           exec "!g++ % -std=c++11 -DLOCAL -Dxiaoai -o    %<"
           exec "!time ./%<"
        elseif &filetype == 'java'
           exec "!javac %"
           exec "!time java %<"
        elseif &filetype == 'sh'
           :!time bash %
        elseif &filetype == 'python'
        exec "!time python3.5 %"
        endif
endfunc
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容