zoukankan      html  css  js  c++  java
  • Linux 下动态库和静态库的创建和调用

    每个程序实质上都会链接到一个或者多个的库。比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等。无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dynamic libary)。
    链接到静态库会使你的程序臃肿,并且难以升级,但是可能会比较容易部署。
    而链接到动态库会使你的程序轻便,并且易于升级,但是会难以部署

    最近写的.c文件比较大,先在决定生成一个linux下面的库,来调用我们编译好的函数,这样子的话我们的主函数就显得比较简洁不是很拥挤,好了下面是样本实例。

    文件目录:

    /mnt/windows/linuxso/

    文件目录下面的文件:

    test1().c test2.c main.c

    文件test1().c内容:

    #include<stdio.h>
    
    #include<stdlib.h>
    
    void hello()
    
    {
    
    	printf("hello ,xmphoenix\n");	
    
    }
    
    void linuxso()
    
    {
    
    	printf("i can use the linux so\n");
    
    		
    
    }
    
    void parso(int a)
    
    {
    
    	int c;
    
    	int b=7;
    
    	c=b+a;
    
    	printf("i get the sum is %d\n",c);	
    
    }

    文件test2().c内容:

    #include<stdio.h>
    
    #include<stdlib.h>
    
    void xmphoenix(int a)
    
    {
    
    	if(a==9)
    
    	{
    
    		printf("I come frome hubei\n");
    
    	}
    
    	else
    
    		printf("i cannot receive your command\n");
    
    }
    

    文件main.c内容:

    #include<stdio.h>
    
    #include<stdlib.h>
    
    int main(int argc,char *argv[])
    
    {
    
    	hello();
    
    	linuxso();
    
    	parso(9);
    
    	xmphoenix(9);
    
    	return 0;	
    
    }

    下面是具体的编译流程:

    静态库:

    静态库也就相当于是把一系列的object文件放在同一个文件中(类似windows中的.lib文件)。当你提供一个静态库给链接器时,连接器将会搜索静态库,从中找到他所需要的object文件,提取出他们,将他们链接到你的程序中,就像你直接提供那些文件一样。

    cr标志告诉ar将object文件封装(archive),我们可以使用nm -s 命令来查看.a文件的内容;

    -L指定了lib的搜索路径,-l指定了链接的库的名字-ltest也就是链接libtest.a

    2011-11-27-16-54

    2011-11-27-16-55

    2011-11-27-16-56

    动态库编译和调用:

    动 态库(static lib)也可一也可以成为共享库(shared lib),一般的后缀名是.so。动态库与静态库有点类似,他们都是一系列的object文件的集合,只是他们的组织方式不同。同样他们的链接方式也是不 同的,动态库只在执行是链接使用,并不把相应的部分编译入程序中,在使用是一个库可以被多个程序使用故可称为共享库,而静态库将会整合到程序中,链接时各 程序使用自己的库。
    -fPIC告诉gcc将源代码编译成共享的object文件,PIC(Position-Independent Code)非位置依赖性代码。

    2011-11-27-16-57

  • 相关阅读:
    openlayers5-webpack 入门开发系列一初探篇(附源码下载)
    leaflet-webpack 入门开发系列二加载不同在线地图切换显示(附源码下载)
    Cesium-空间分析之通视分析(附源码下载)
    Geoserver2.15.1 配置自带 GeoWebCache 插件发布 ArcGIS Server 瓦片(附配置好的 Geoserver2.15.1 下载)
    leaflet-webpack 入门开发系列一初探篇(附源码下载)
    maven学习(上)- 基本入门用法
    Java面试11|Maven与Git
    必须学会git和maven
    Git 安装和使用教程
    用git,clone依赖的库
  • 原文地址:https://www.cnblogs.com/xmphoenix/p/2265149.html
Copyright © 2011-2022 走看看