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
    
  • 相关阅读:
    Qt Quick 简单介绍
    Windows下ElasticSearch及相关插件的安装
    Light OJ 1317 Throwing Balls into the Baskets 概率DP
    Cocos2d-x-lua学习点滴
    JAVA网络编程--UDP通信
    ASP.NET Web API 应用教程(一) ——数据流使用
    NGUI创建Camera参数为Simple 2D的UI UI对象的结构UI Root(2D)
    端口扫描器——ZenmapKail Linux渗透测
    直接操作游戏对象C#游戏开发
    BeagleBone Black项目实训手册(大学霸内部资料)
  • 原文地址:https://www.cnblogs.com/2aptx4869/p/15031894.html
Copyright © 2011-2022 走看看