zoukankan      html  css  js  c++  java
  • Linux下的静态库与动态库的生成与调用

    静态库与动态库

    静态函数库
    这类库的名字一般是libxxx.a,xxx为库的名字。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
    
    动态函数库
    这类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号。当然也可以不要版本号,但名字必须有。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。

    1. 生成动态库并调用

    创建文件,用于生成.so

    // add.h
    #include<iostream>
    int add(int a,int b);
    
    //add.cpp
    #include "add.h"
    int add(int a, int b)
    {
        return a+b;
    }
    
    // hello.h
    #include<iostream>
    
    using namespace std;
    
    void hello();
    // hello.cpp
    #include"hello.h"
    
    using namespace std;
    
    void hello()
    {
    
        cout << "Hello World!!"<<endl;
    }

     创建main.cpp 调用.so文件

    #include"add.h"
    #include"hello.h"
    
    using namespace std;
    
    int main(int argc,char *argv[])
    {
        int a = 20;
        int b = 30;
        cout << "a + b = " << add(a,b)<< endl;
        hello();
        return 0;
    }

    ******利用cmake生成so文件 并调用*******

    首先在当前目录下创建CMakeLists.txt

    # CMakeLists.txt
    cmake_minimum_required(VERSION 2.8)
    project(MySharedLib)
    # C++11 编译
    set(CMAKE_CXX_STANDARD 11)
    #创建共享库
    add_library(MyTest SHARED add.cpp hello.cpp)
    #
    add_library该指令的主要作用就是将指定的源文件生成链接文件 SHARED库会被动态链接(动态链接库)

    进入build文件夹下执行cmake .. make 即可生成.so文件

     开始测试so文件,在新文件夹下创建include、lib和build文件 创建main.cpp  将add.h hello.h 放入include文件夹 libMyTest.so 放入lib文件夹下,创建CMakeLists.txt

    # CMakeLists.txt
    cmake_minimum_required(VERSION 2.8)
     
    #项目名:test
    project(main)
     
    # C++11 编译
    set(CMAKE_CXX_STANDARD 11)
    
    # 指定头文件路径
    set(INC_DIR /home/wangxiaobei/Software/TryMakeSo/test_so/include)
     
    # 库文件路径 指定静态和动态文件目录
    set(LIB_DIR /home/wangxiaobei/Software/TryMakeSo/test_so/lib)
     
    #指定头文件目录
    include_directories(${INC_DIR})
     
    #链接库路径
    link_directories(${LIB_DIR})
     
    #链接库,MySharedLib为库名
    link_libraries(MyTest)
     
    #生成目标文件 
    add_executable(c_main main.cpp)
    
     # 链接 库文件 MySharedLib 库
    target_link_libraries(c_main MyTest)

    进入build 执行cmake ..      make   则生成可执行文件c_main

    ******利用g++生成so 并调用*******

    执行g++ add.cpp hello.cpp -fPIC -shared -o libtest.so 将两个.cpp文件生成 test.so 文件

     创建main.cpp 调用.so文件

    #include"add.h"
    #include"hello.h"
    
    using namespace std;
    
    int main(int argc,char *argv[])
    {
        int a = 20;
        int b = 30;
        cout << "a + b = " << add(a,b)<< endl;
        hello();
        return 0;
    }

    g++ main.cpp -L. -ltest -o main 

    -L参数:指明要链接的so库所在路径(如-L. 表示当前路径, -L../so 表示当前路径的上一层目录的so子文件夹中)

    -l参数:指明要连接的库的名字,如-ltest 表示要链接libtest.so库

    直接运行会报错 因为没有链接到.so文件,需要在./mian之前告诉so文件的位置 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./libtest

    【参考博文】致谢

     https://blog.csdn.net/cindywry/article/details/86063930

    https://blog.csdn.net/bigdog_1027/article/details/79113342

  • 相关阅读:
    SEO(搜索引擎优化)已死
    C#与Java的详细比较(全)
    回眸·预言:Google媒体,称霸在2014 (转载)& 2015 update
    转载:Google calendar预览
    一个开源的ESB(企业服务总线) Celtix
    未来网虫生活图景
    今年圣诞节google标的意思
    我的生活质量
    Google Reader的午夜维护信息
    SNS网站应该更加自然
  • 原文地址:https://www.cnblogs.com/wangxiaobei2019/p/12018534.html
Copyright © 2011-2022 走看看