LinuxC++开发记录(g++)
g++使用
1. 编译过程
- 预处理(-E)
- 编译(-S)
- 汇编(-c)
- 链接
1.1 预处理(-E)
为了直观的了解预处理,理解预处理做了哪些工作,不说那么多,直接上代码,创建main.h与main.cpp文件,有头文件引用,有宏定义,有注释,还有未定义参数赋值的错误。代码如下:
/* main.h */
#define VALUES 100
int test(); void test2(){} void test3(){} void test4(){}
/* main.cpp */
#include <main.h> int main()
{
// 参数未定义
a = ;
return test();
} int test()
{
return VALUES;
}
预处理:
g++ -E main.cpp -I. > main.i
-I.表示头文件在当前路径
main.i为:
# "main.cpp"
# "<built-in>"
# "<command-line>"
# "/usr/include/stdc-predef.h"
# "<command-line>"
# "main.cpp"
# "./main.h" int test(); void test2(){} void test3(){} void test4(){}
# "main.cpp" int main()
{ a = ;
return test();
} int test()
{
return ;
}
生成很顺利,可以看出,预处理工作:
- 不关注语法错误
- 宏替换
- 消除注释
- 将头文件整个包括进来,连空行都是完整的复制过来的
1.2 编译(-S)
编译将会把预处理生成的.i文件生成为.s的汇编代码文件。
继续上面的代码,当我们尝试编译上面生成的main.i文件时,会提示语法错误:
g++ -S main.i
main.cpp: In function ‘int main()’:
main.cpp::: error: ‘a’ was not declared in this scope
a = ;
我们在main.c中加入int a;
g++ -E main.cpp -I. > main.i
g++ -S main.i
这样就可以通过编译,默认生成main.s汇编文件,打开如下:
.file "main.cpp"
.text
.globl _Z5test2v
.type _Z5test2v, @function
_Z5test2v:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset
.cfi_offset , -
movq %rsp, %rbp
.cfi_def_cfa_register
nop
popq %rbp
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE0:
.size _Z5test2v, .-_Z5test2v
.globl _Z5test3v
.type _Z5test3v, @function
_Z5test3v:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset
.cfi_offset , -
movq %rsp, %rbp
.cfi_def_cfa_register
nop
popq %rbp
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE1:
.size _Z5test3v, .-_Z5test3v
.globl _Z5test4v
.type _Z5test4v, @function
_Z5test4v:
.LFB2:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset
.cfi_offset , -
movq %rsp, %rbp
.cfi_def_cfa_register
nop
popq %rbp
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE2:
.size _Z5test4v, .-_Z5test4v
.globl main
.type main, @function
main:
.LFB3:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset
.cfi_offset , -
movq %rsp, %rbp
.cfi_def_cfa_register
subq $, %rsp
movl $, -(%rbp)
call _Z4testv
leave
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE3:
.size main, .-main
.globl _Z4testv
.type _Z4testv, @function
_Z4testv:
.LFB4:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset
.cfi_offset , -
movq %rsp, %rbp
.cfi_def_cfa_register
movl $, %eax
popq %rbp
.cfi_def_cfa ,
ret
.cfi_endproc
.LFE4:
.size _Z4testv, .-_Z4testv
.ident "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609"
.section .note.GNU-stack,"",@progbits
从这开始就和汇编是一样的了,再深入就需要去了解汇编的原理,后面两个过程不再详细描述。
1.3 汇编(-c)
汇编的工作是将汇编代码转成机器代码,注意“-c”是小写字母,而预处理和编译都是大写字母。汇编后生成.o目标文件。
g++ -c main.i
生成main.o
1.4 链接(-o)
将.o、.a、.so等文件链接生成可执行文件。
g++ main.o -o main
生成main可执行文件
g++ main.o
生成默认的a.out可执行文件
2. 编译单文件
g++ main.cpp [-o target_file_name]
生成单个文件很简单,可通过-o参数指定生成文件名称。不指定则默认生成a.out文件。
3. 编译同目录下多个文件
├── proj
│ ├── main.cpp
│ ├── test.cpp
│ ├── test.h
g++ main.cpp test.cpp -o main.out
4. 编译不同目录下多个文件(一次性、参数-I)
还是上面的代码,目录结构改了,将test.cpp、test.h放到test文件夹下:
├── proj
│ ├── main.cpp
│ ├── test
│ │ ├── test.cpp
│ │ ├── test.h
g++ main.cpp ./test/test.cpp -Itest -o main.out
因为test.cpp、test.h和main.cpp不在相同文件夹内,所以需要指定cpp文件地址及.h文件所在目录。
-I :指定头文件所在目录。
5. 编译不同目录下多个文件(分步)
文件结构与4一致。
4需要指定具体的文件,而且每次编译的时候需要把所有的cpp文件都编译一次,有时候我们只改一个文件并不需要全部重新编译。我们可以将源文件编译成一个.o汇编代码文件,最后再链接再链接在一起。
目录结构:
├── proj
│ ├── main.cpp
│ ├── test
│ │ ├── test.cpp
│ │ ├── test.h
│ ├── obj
生成test.o到obj目录:
g++ -c ./test/test.cpp -Itest -o ./obj/test.o
生成可执行文件:
g++ main.cpp ./obj/test.o -o main.out
6. g++常用命令选项
LinuxC++开发记录(g++)的更多相关文章
- CozyRSS开发记录22-界面退化
CozyRSS开发记录22-界面退化 1.问题1-HtmlTextBlock 找的这个HtmlTextBlock有很严重的bug,有时候显示不完全,有时候直接就崩了.然后看了下代码,完全是学生仔水平写 ...
- CozyRSS开发记录21-默认RSS源列表
CozyRSS开发记录21-默认RSS源列表 1.默认列表 在第一次使用CozyRSS的情况下,我们让它内置五个RSS源吧: 2.响应RSS源的更新 先不处理RSS源列表项的点击,响应下下拉菜单里的更 ...
- CozyRSS开发记录20-CanResizeWithGrip
CozyRSS开发记录20-CanResizeWithGrip 1.窗口样式 首先,WindowStyle有四种: 然后,对于窗口缩放的ResizeMode,也有四种,CanResize和CanRes ...
- CozyRSS开发记录19-窗口标题栏交互
CozyRSS开发记录19-窗口标题栏交互 1.谈谈对mvvm解耦的看法 在使用mvvm时,如何操作窗口,这是一个问题.这个问题的关键点是:mvvm是把view和viewmodel解耦了的,很多写法一 ...
- CozyRSS开发记录18-番外之Atom1.0的支持
CozyRSS开发记录18-番外之Atom1.0的支持 1.对CozyRSS.Syndication批判一番 由于我工作的主要开发语言是c++,所以会看到我的c#代码写得非常朴素,很多语法糖都没有用上 ...
- CozyRSS开发记录17-Html2Xaml
CozyRSS开发记录17-Html2Xaml 1.RssContentView还需要优化 上回做了RssContentView的显示,但是对于rss返回的描述(摘要),连换行的没有,更别说里面还有h ...
- CozyRSS开发记录16-RssContentView显示
CozyRSS开发记录16-RssContentView显示 1.RssContentView的布局和绑定 继续参照原型图来写xaml: 然后在RSSContentFrameViewModel里提供绑 ...
- CozyRSS开发记录15-获取和显示RSS内容
CozyRSS开发记录15-获取和显示RSS内容 1.内容列表 我们先给RSSContentFrame增加一个ViewModel,里面和RSS源列表一样,提供一个ObservableCollectio ...
- CozyRSS开发记录14-RSS源管理初步完工
CozyRSS开发记录14-RSS源管理初步完工 1.添加源的响应 DialogHost.Show有几个版本的重载,加一个DialogClosingEventHandler参数.我们让添加源对话框的添 ...
随机推荐
- Si7006主要面向传统上使用的分立RH / T传感器的低精度的应用
Silicon Labs的Si7006 / 13/20/21个I 2 C相对湿度及温度传感器结合充分工厂校准湿度和温度传感器元件与模拟-数字转换器,信号处理和一个I 2 C主机接口.专利使用业界标准低 ...
- mjpg-streamer视频服务器移植
相关软件下载地址:http://pan.baidu.com/s/16yo8Y JPEG库的移植 对于内核linux-2.6.35,不能再使用servfox,如果要使用的需要修改大量的代码.在此选用新的 ...
- Java8集合框架——HashSet源码分析
本文的目录结构: 一.HashSet 的 Javadoc 文档注释和简要说明 二.HashSet 的内部实现:内部属性和构造函数 三.HashSet 的 add 操作和扩容 四.HashSet 的 r ...
- 自己安装windows版本的Flink
参照 https://blog.csdn.net/clj198606061111/article/details/99694033 我自己做一遍 找到对应的网址 https://flink.apach ...
- Web前端开发CSS规范总结
作为Web前端开发必备语言,CSS为大家广为熟知,今天就跟大家分享下CSS规范总结,Web前端的小伙伴们看过来吧! CSS样式的权值(权重) 权值等级的定义 第一等:代表内联样式,如: style=” ...
- sendgrid 批量发送邮件,收件栏只显示当前用户的方案
需求:批量发送邮件,用户可能看到其他用户的邮箱地址,之前用BBC发送,但问题是接收地址是同一个. 官方解决方案:https://sendgrid.kke.co.jp/docs/Tutorials/A_ ...
- Codeforces 176B 经典DP
非常好的一个题目,CF上的DP都比较经典 题意就是 给定一个串A,B,正好执行K次操作,每次操作可以把 A串从中间切开,并调换两部分的位置,问最后得到B串共有多少种不同的切法(只要中间有一次不同,即视 ...
- goroutine简介
一.goroutine简介 Golang中最迷人的一个优点就是从语言层面就支持并发 在Golang中的goroutine(协程)类似于其他语言的线程 并发和并行 并行(parallelism)指不同的 ...
- 给element的confirm加自定义指令
问题描述,因为自定义指令一般直接加在页面html标签上,但是element封装好的confirm的确认按钮没法添加自定义指令,如图: 解决办法:加个其他的隐藏标签,监听撤销事件,让其他的标签自动触发c ...
- 19 — node 模块化 及 CommonJS规范 — CommonJS 的由来及各组织与 JS 的关系
ECMAScript 对于不同的环境(运行平台),设计结构,理念,使用方式大相径庭. 1,浏览器 :DOM BOM 2,NodeJS :FS,HTTP 内置模块 : 第三方模块 : 内置模块 3, ...
