• 【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,那么以上都不好使

    1. gcc main.c -o app
    2. g++ -std=c++11 main.cpp -o app
    3. 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

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

  • 相关阅读:
    玩机搞机---卸载内置软件 无root权限卸载不需要的软件 安全卸载
    SpringBoot运行流程源码分析------阶段三(Spring Boot外化配置源码解析)
    san.js源码解读之工具(util)篇——inherits函数
    python-(4-2)数据类型的应用(列表)
    word转PDF的方法 简介快速
    银发经济崭露头角:海外网红营销如何助力假发品牌增长
    云服务器+ngrok搭建内网穿透服务(只有公网ip无域名)
    纯c语言版单链表(上)
    别再自己瞎写工具类了,Spring Boot 内置工具类应有尽有, 建议收藏
    JUC学习
  • 原文地址:https://blog.csdn.net/callmejielun/article/details/126382892