zoukankan      html  css  js  c++  java
  • C/C++ 静态链接库 与 动态链接库

    C/C++ 静态链接库 与 动态链接库

    预说明

    1. C的命令是 gcc
    2. C++的命令是 g++
    3. C++是C的超集, g++是gcc的超集
    4. g++能编译C,gcc不能编译C++

    就是因为4,卡了半天

    用g++生成的库,是没办法用gcc链接的,反之成立

    用到的文件

    (都在同一目录下)

    //add.h
    #ifndef H_ADD_H
    #define H_ADD_H
    
    int add(int a, int b);
    
    #endif //H_ADD_H
    
    //add.cpp
    #include "add.h"
    
    int add(int a, int b) {
        return a + b;
    }
    
    //main.cpp
    #include <stdio.h>
    #include "add.h"
    
    int main() {
        int a, b;
        scanf("%d%d", &a, &b);
        printf("%d", add(a, b));
        system("pause");
        return 0;
    }
    

    静态链接库

    静态链接库,在linux下后缀为.a,windows为.lib,本质上没啥区别

    静态库在最终链接的时候,相当于替换,内存中存在多分副本,浪费内存

    好处是编译完之后,就和编译环境没关系了,可移植性强

    想要生成静态库,首先

    生成可重定位目标.o文件

    g++ -c add.cpp
    

    打包生成静态库

    # ar -crv libxxx.lib(xxx是生成的库的名字) xxx.o
    ar -crv libadd.lib add.o
    

    在编译main的同时链接 .lib 文件

    #g++ -o xx.exe xx.cpp -L库所在的地址 库名
    g++ -o main.exe main.cpp -L"D:UsersAdministratorMy Documentproblem" libadd.lib
    

    动态链接库

    静态链接库,在linux下后缀为.so,windows为.dll,本质上也没啥区别

    动态库,内存中只存一份备份,目标代码在运行时或者加载时链接,会因编译环境改变可能出现问题, 可移植性差

    生成可重定位目标.o文件

    g++ -c add.cpp
    

    生成动态库可以一步到位

    g++ -fPIC -shared libadd.dll add.cpp
    

    在编译main的同时链接 .dll 文件

    g++ -o A.exe A.cpp -L"D:UsersAdministratorMy Documentproblem" libadd.dll
    
  • 相关阅读:
    .Matrix-第三篇冲刺随笔
    .Matrix-第二篇冲刺随笔
    Alpha冲刺-第九次冲刺笔记
    Alpha冲刺-第八次冲刺笔记
    Alpha冲刺-第七次冲刺笔记
    Alpha冲刺-第六次冲刺笔记
    Alpha冲刺-第五次冲刺笔记
    Alpha冲刺-第四次冲刺笔记
    Alpha冲刺-第三次冲刺笔记
    Alpha冲刺-第二次冲刺笔记
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/15031894.html
Copyright © 2011-2022 走看看