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
    
  • 相关阅读:
    angular学习一框架结构认识
    关于react上线系列问题及解决方案
    typescript学习笔记
    keepalived + glusterfs实现高可用
    nginx限制单个IP的最大连接数量限制下载速度
    初识Python.day2
    初识Python
    服务器安装到优化
    windows云服务器数据迁移
    z字形变换
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/15031894.html
Copyright © 2011-2022 走看看