静态库与动态库的制作-创新互联

1、相关知识

创新互联专业为企业提供通川网站建设、通川做网站、通川网站设计、通川网站制作等企业网站建设、网页设计与制作、通川企业网站模板建站服务,十年通川做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

 (1)、不管是制作静态库还是动态库,都得对.o文件进行打包;

 (2)、在/lib64目录下,静态库文件.a,动态库文件.so

2、静态库

 (1)、gcc -c add.c  ------> 生成add.o文件,其中通过参数(-c);

 (2)、静态库由命令ar创建; ar -cr add.a add.o

(3)、静态库的编译有两种方法:

a:gcc test.c -o test -L. add.a //每次都得在编译时加上-L. 静态库文件;

 b、将.a文件(此时的.a文件必须为lib开头的)放到/lib64目录下面,此时就不加-L.参数了,但是运行时要加上静态库文件(-lxxxx);

样例实现

第一步:打包成 .o文件

静态库与动态库的制作

第二步:创建.a文件

静态库与动态库的制作

第三步1:当前目录下通过-L. .a文件进行编译

静态库与动态库的制作

第四步1:运行结果

静态库与动态库的制作

第三步2:不在当前目录下面加-L. .a文件编译,此时就必须的改名为libshow.a;然后移到/lib64目录下面,在编译时加上参数:-lshow

静态库与动态库的制作

第四步2:运行结果

静态库与动态库的制作

以上就是静态库的制作了,按照规定流程走,最好都制作为libxxxxx.a

 a、先生成.o文件;

 b、打包成libxxxx.a文件;

 c、此时2种编译途径,当前目录下利用-L. libxxx.a或-lxxxx进行编译;

 d、只要编译成功,放之四海皆可执行--------->因为利用静态函数库编译的文件比较大

3、动态库的制作

 .so:用在版本升级上有优势;核心参数:-shared -fpic

 gcc -shared -fpic -o libshow.so show.c   :-fpic->产生位置无关代码 -shared:->生成共享库

样例实现

第一步:实现创建libxxxx.so文件

静态库与动态库的制作

第二步:将libxxxx.so文件移动到/lib64下

静态库与动态库的制作

第三步:运行编译

静态库与动态库的制作

注意:

 (1)、动态库只有这一种编译运行的方式,必须将.so文件放到/lib64目录下,且文件名必须为libxxx.so;

 (2)、静态库的libxxx.a文件不放,也可以编译运行成功;

4、动态加载

 在运行时才被加载到内存当中,效率相当的高;编译时要在最后加一个选项:-ldl

通过一系列的API完成;

 静态库与动态库的制作

 用C语言实现:

第一步:先创建一个libxxx.so文件

静态库与动态库的制作

第二步:写加载的程序

test.c

#include"show.h"
#include<dlfcn.h>

typedef void(*pFun)(char *);   //定义实现该方法的函数指针

int main(void){
    void *d1 = dlopen("libshow.so", RTLD_LAZY);  //打开这个动态库文件
    if(d1 == NULL){
        perror("dlopen");
        return -1; 
    }   

    pFun pfun = (pFun)dlsym(d1, "show");  //寻找名称为show的函数

    pfun("abcd");  //找到之后,函数指针在接着调用即可
    dlclose(d1);

    return 0;
}

第三步:直接进行编译运行,在最后加上参数:-ldl

静态库与动态库的制作

这样就实现了动态加载.so文件的方法;

用C++实现:

(1)、第一步:创建一个libxxx.so文件

静态库与动态库的制作

(2)、第二步:移动到/lib64下

静态库与动态库的制作

(3)、第三步:编译运行

静态库与动态库的制作

此时发送了段错误;

分析:

 (1)、C语言找函数名称没有问题;

 (2)、C++在动态链接库中找不到函数名字;因为C++具有重载,其函数名称早已经不是我们所看到的函数名称;

解决方案:

 (1)、通过汇编,找其对应的函数名称;

 (2)、extern "C" ,扩展C,用C的特性即可;

改进的代码如下:

/////////////////////////////////////////////////////////////////////////////
show.h
#ifndef _SHOW_H_
#define _SHOW_H_

#include<stdio.h>
#include<iostream>
using namespace std;

extern "C" void show(char *str);  //扩展C,使其拥有C的性质(就将这个函数当做C语言解释),函数名称就是我们所看到的,好找函数名称

#endif
////////////////////////////////////////////////////////////////////////////
show.cpp
#include"show.h"

extern "C" void show(char *str){
    cout<<str<<endl;
}
///////////////////////////////////////////////////////////////////////////////
test.cpp
#include"show.h"
#include<dlfcn.h>

typedef void(*pFun)(char *); 

int main(void){
    void *d1 = dlopen("libshow.so", RTLD_LAZY);
    if(d1 == NULL){
        perror("dlopen");
        return -1; 
    }   

    pFun pfun = (pFun)dlsym(d1, "show");

    pfun("abcd");
    dlclose(d1);

    return 0;
}

静态库与动态库的制作

静态库与动态库的制作

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

网站名称:静态库与动态库的制作-创新互联
网站URL:https://www.cdcxhl.com/article8/dshsip.html

成都网站建设公司_创新互联,为您提供做网站建站公司标签优化动态网站搜索引擎优化全网营销推广

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都网站建设