【Linux】03_编译原理

vi

visual interface编辑文本,无排版,也就是记事本。

可执行、输出、删除、查找、替换等众多文本操作。

无菜单,有命令,而且很多。

i:进入到当前位置

I:行首

a:当前之后

A:行末

o:下一行

O:上一行

M:中间行,一共10行,就是5行

esc:进入命令行:q:q!:wq

gg开头、G结尾,数字+G对应行

yy:复制当前行,nyy:复制接下来的n行,p粘贴。

u:撤回,U撤销之前的所有。

dd:删除当前行,ndd:删除n行。

dw:删除此后的,还是这个单词的内容。

hjkl:左下上右

/:查找,例如/return,就是在文本中查找关键字。n向下,N向上

gg=G排版。

sp上下分屏,vsp左右

vsp 路径文件,双屏。cww切换。cw大于小于号,调宽度。

vim -o3 f1,f2,f3,以左右的方式打开3个文件,如果是O就是上下。

gcc/gdb

gcc和gdb有直接联系。

gcc是编译器。gdb是调试工具。

gcc可以调试各种版本的内容

gdb就是看哪里出了问题

用gcc做好软件,编译后如果有问题,可以用gdb调试.。

当然 gdb不仅仅可以调试C语言,而vim只是一个编译器而已。

之所以和gcc,gdb放一起说,是因为在Linux/Unix上,很多人都用vim来书写C语言的源码。所以这三个联系的纽带就是C语言,分别负责编写,调试,和编译

IDE集成开发工具,即vs、qt合成vi与gcc的功能。

gcc -v,查看编译期版本号

gcc main.c add.c -I./include -o myapp

这里include就是编译头文件。

也就是说,我们把头文件写到一个文件里,然后编译的时候,用-I作为参数,来提供头文件即可。

如果加入了-g,就是表示要调试,这样生成的exe文件就会更大。

然后,用gdb加上新的exe文件,就进入了gdb调试模式

list是查看代码,回车继续查看。

start从main开始第一行开始执行,执行到下一个断点

n是继续执行下一行。重新start就回到第一行了。

continue继续到下一个断点

run直接到断点位置

quit退出gdb模式

如果没有-g,那么以上都不好使

gcc main.c -o app
g++ -std=c++11 main.cpp -o app
gcc main.c add.c -I./include -o myapp

-Wall加入错误

disable,禁用断点

看变量print*(&变量),或者是:p 变量名

编译原理

-E预处理:包括头文件展开、宏替换、#开头命令的执行,生成.i文件,由预处理器完成

-S编译:将预处理后生成的文件,生成汇编语言,生成.s文件,由编译器完成

-c汇编:将汇编语言变成机器语言,生成.o/.obj(windows)文件,由汇编器完成

-o链接:将目标语言、静态库、动态库,生成可执行文件,由链接器完成

Linux静态库动态库

项目开发目录:include、lib、src,src也就是c/cpp文件。

Linux中的动态库叫做:共享库。

共享库.so不调用的时候不运行,只是磁盘里的一个文件。

windows中的操作:【C++】静态库动态库_王向晚的博客-CSDN博客

Linux下,静态库后缀是.a,动态库是.so,与windows一直,.so文件只有在执行时才会调用。

静态库创建命令:ar rcs libmylib.a file1.0

将一系列.o文件打包成库。

共享库命令:gcc -fPIC -c app.c sub.c

PIC表示代码与位置无关。

将众多.c文件生成.o文件

gcc -c就是生成.o文件,不进行最后一步链接

静态库步骤

gcc -fpic -c add.c sub.c在src目录中生成.o文件。

静态库是ar命令,ar rcs 静态库名字.a 合体需要的.o文件

例如ar rcs mylib.a add.o sub.o

nm mylib.a用来查看库文件,正常是不能cat出来的,是乱码。

最后写主函数然后进行编译:

gcc main.c -I../include ../lib/mylib.a -o app,至此成功了。

我们ar rcs的步骤就是把其中的库文件打包起来生成库文件,在其中的.c当中,不用进行头文件的书写,只需要把头文件都写在一起就行。

步骤:

  1. 将.c文件变成.o文件
  2. 将所有.o文件进行打包成.a文件
  3. 带头文件和库文件进行主函数编译

共享库

共享库有三个文件名:real name、soname、linker name

真正的库文件名字是real,包含完整的库版本号

soname是一个链接名,只顾包含共享库的主版本号,主版本号一直即可保证接口一致,因此,只要soname一致,这个共享库就可以使用。

例如realname是3.6.18,但是soname就是3.6就行。

linkername只在编译链接的时候使用。

共享库步骤

共享库生成:

gcc -shared -Wl,-soname,mydll.so.1 -o mydll.so.1.0.1 *.o

首先shared表示是共享库,Wl是参数,soname是.1的,而后跟的是realname,最后是把所有的.o文件合体,生成了一个realname的so文件。再移动到lib中。

共享库加载:

ELF二进制程序,就是Linux的执行程序。

要把共享库添加至缓存管理:修改配置文件、加入共享库路径、测试

ls -l /etc/ld.so.conf

发现是root权限,利用sudo

sudo vi /etc/ld.so.conf

在文件中加入,库所在的路径,我们放入了lib目录中

/home/xxx/linux/lib/lib

sudo ldconfig -v更新配置文件,重新读取

形式是:soname:realname

继续编译:

gcc main.c -I../include ../lib/mylib.a -o app

这里共享库没有更新...可能是我失败了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值