• c++代码的编译


    1.gcc和g++
        1.1搞清楚几个名字
            GCC :GNU Compiler Collection (GUN编译套件),可以编译c,c++,java,objective-c,Fortran等语言。
            gcc :GCC中的 GUN C Compiler(C 编译器)
            g++:GCC中的GUN C++ Compiler(C++编译器)
        
        1.2 编译过程
            .c—>.i—>.s—>.o—>可执行文件
            预处理: .c —>.i  (宏替换,去掉注释,引入头文件) gcc -E
            编译: .i—>.s  (生成汇编代码) gcc -S
            汇编: .s —>.o  (汇编代码转化为机器码)gcc -c
            链接:.o —> 可执行程序(调用链接器ld来链接目标文件生成可执行文件)
        
        1.3 gcc的调用过程    
           当在调用gcc时,并不是直接调用的c语言的编译器,实质上它根据要编译的文件是.c结尾还是.cpp结尾来确定使用c语言编译器还是c++编译器。在使用gcc和g++来编译c++文件时,gcc不能链接c++的一些库,所以编译c++时最好使用g++。在编译阶段,g++会调用gcc。
     
    2.动态链接库与静态链接库
        2.1 静态链接库
             中间文件在windows下为.obj,在linux下为.o,windows下.obj的集合就是.lib,linux下.o的集合就是.a
            .a或者.lib称为静态链接库,通过静态库编译出的程序一般都很大,而且静态库如果发生变化就要重新编译生成可执行程序,但是编译后不依赖外部文件就可以运行
            linux下创建静态库:ar 
                ar的参数:
                    r:插入模块到库中,如果库中存在该模块,替换
                    s:写入一个目标文件到库中,或者更新该目标文件
                    v:程序执行时显示详细信息
                    t:显示打包文件中所包含的文件
                    d: 删除
                    q:添加
            ar  -rv   libmytest.a  test1.o  test2.o   
        2.2 动态链接库    
            .so或者.dll称为动态连接库,程序在执行到动态库中的函数才调用相应函数,编译的时候不会整和到可执行程序中,所以可执行程序一般比较小,并且如果动态库发生变化也不需要重新编译可执行程序,升级的时候方便,linux下动态库一般存放在 /lib, /usr/lib 和 /usr/local/lib下,但是程序运行的时候必须提供动态链接库支持。
            linux下创建动态库: -shared
                gcc  -fPIC  -c test1.c (-fPIC产生与位置无关的代码,使得.so文件能被多个程序使用
                gcc  -fPIC  -c test2.c 
                gcc  -shared  -o libmytest.so  test1.o  test2.o    
                上面三句话创建一个动态库mytest ,也可以用一句命令: gcc -fPIC -shared  -o libmytest.so  test1.c  test2.c
     
    3.gcc编译的参数
        -E :预处理  gcc -E test.c -o test.i
        -S:编译 gcc -S test.i  -o test.s 
        -c:汇编 gcc -c test.s  -o test.o      
        -o: 不使用默认命名
        -g: 加入调试信息
        -w:不生成警告信息
        -Wall:生成警告信息
        -Idir:指定头文件目录,在使用#include的时候会首先在这里查找,查找不到再去默认的头文件目录查找 ,默认/usr/include   
        -I:取消前一个参数的功能,一般在 -Idir后面使用 
        -include file :引用其他文件,功能类似于#include<file>
            gcc -test.c -include /home/username/test/test.h
        -Ldir:指定库的搜索路径
        -llibrary:指定编译时使用的库   gcc -lmylib  test.c  使用mylib库编译程序,对应的库文件名为libmylib.so
                lib库名.so  =  库文件名        
                /lib,/usr/lib和/usr/local/lib里的库直接用-l参数就能链接,没在这三个地方时使用-L指定路径。
        
    4.多个文件的编译
        多个文件需要编译时一般有两种方式,一是所有源文件一起编译,一是分别编译每个源文件,最后链接。前者需要将程序一次性编译,适合体量小的程序,分别编译的好处是某个文件改变时只需要编译改变的文件,不需要重新编译所有文件。
     
    5.makefile文件
        对于文件很多,一个项目的情况下,可以把编译过程写在一个文件中,执行这个文件就可以一步一步编译,这个文件通常命名为makefile或者Makefile,在linux下make命令会执行名字为makefile或Makefile的文件,也可以使用其他命名如makefileHp,这个时候需要使用make -f  makefileHp命令来指定执行这个文件。
     
  • 相关阅读:
    Nginx+Keepalived实现简单的服务高可用
    搭建私有镜像仓库
    GlusterFS
    GlusterFS分布式存储系统
    GlusterFS分布式存储
    ladp日志配置
    go mod位置和自定义包引入问题
    .netcore 使用redis
    一篇技术博文引发的stylelint项目实践
    React Hooks使用避坑指南
  • 原文地址:https://www.cnblogs.com/Zhangyq-yard/p/8623821.html
Copyright © 2020-2023  润新知