加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

如何创建和使用Linux静态/动态链接库

发布时间:2016-09-04 22:32:31 所属栏目:Linux 来源:站长网
导读:和Windows系统一样Linux也有静态/动态链接库,下面介绍创建和使用方法: 假设有下面几个文件: 头文件String.h,声明相关函数原形,内容如下: Strlen.c:函数S

生成动态链接库:

gcc  -fpic -shared -o libstr.so  Strlen.c Strnlen.c

-fpic 使输出的对象模块是按照可重定位地址方式生成的。

-shared指定把对应的源文件生成对应的动态链接库文件libstr.so文件。

对应的链接库已经生成,下面看一下如何使用对应的链接库。

静态库的使用:

假设有下面的文件要使用对应的的静态库:

编译生成对应的目标文件:

gcc -c -I/home/hcj/xxxxxxxx main.c

生成可执行文件:

gcc -o main1 -L/home/hcj/xxxxxxxx main.o libstr.a

其中-I/home/hcj/xxxxxxxx和-L/home/hcj/xxxxxxxx是通过-I和-L指定对应的头文件和库文件的路径。libstr.a是对应的静态库的名称。这样对应的静态库已经编译到对应的可执行程序中。执行对应的可执行文件便可以对应得函数调用的结果。

<span style="font-size:18px;"><strong>/***************************************** 
FileName: main.c 
Description: test static/dynamic library 
Author: HCJ 
Date  : 2005-5-7 
******************************************/
#include<stdio.h>  
#include <String.h>   //静态库对应函数的头文件  
      
int main(int argc, char* argv[])  
{  
    char str[] = {"hello world"};  
    unsigned long ulLength = 0;  
      
    printf("The string is : %sn", str);  
    ulLength = Strlen(str);  
    printf("The string length is : %d(use Strlen)n", ulLength);  
    ulLength = StrNlen(str, 10);  
    printf("The string length is : %d(use StrNlen)n", ulLength);  
      
    return 0;  
}</strong></span>

动态库的分为隐式调用和显式调用两种调用方法:

隐式调用的使用使用方法和静态库的调用差不多,具体方法如下:

gcc -c -I/home/hcj/xxxxxxxx main.c

gcc -o main1 -L/home/hcj/xxxxxxxx main.o libstr.so  //这里是*.so

在这种调用方式中,需要维护动态链接库的配置文件/etc/ld.so.conf来让动态链接库为系统所使用,通常将动态链接库所在目录名追加到动态链接库配置文件中。否则在执行相关的可执行文件的时候就会出现载入动态链接库失败的现象。在编译所引用的动态库时,可以在gcc采用 –l或-L选项或直接引用所需的动态链接库方式进行编译。在Linux里面,可以采用ldd命令来检查程序依赖共享库。

显式调用:

<span style="font-size:18px;"><strong>/***************************************** 
FileName: main2.c 
Description: test static/dynamic library 
Author: HCJ 
Date  : 2005-5-7 
******************************************/
#include<stdio.h>  
#include<dlfcn.h>  
      
int main(int argc, char* argv[])  
{  
    //define function pointor  
    int (*pStrlenFun)(char* pStr);     //声明对应的函数的函数指针  
    int (*pStrnlenFun)(char* pStr, int ulMaxLen);  
      
    char str[] = {"hello world"};  
    unsigned long ulLength = 0;  
      
    void *pdlHandle;  
    char *pszErr;  
      
    pdlHandle = dlopen("./libstr.so", RTLD_LAZY);  //加载链接库/libstr.so  
    if(!pdlHandle)  
    {  
        printf("Failed load libraryn");  
    }  
    pszErr = dlerror();  
    if(pszErr != NULL)  
    {  
        printf("%sn", pszErr);  
        return 0;  
    }  
      
    //get function from lib  
    pStrlenFun = dlsym(pdlHandle, "Strlen"); //获取函数的地址  
    pszErr = dlerror();  
    if(pszErr != NULL)  
    {  
        printf("%sn", pszErr);  
        return 0;  
    }  
      
    pStrnlenFun = dlsym(pdlHandle, "StrNlen");  
    pszErr = dlerror();  
    if(pszErr != NULL)  
    {  
        printf("%sn", pszErr);  
        return 0;  
    }  
      
    printf("The string is : %sn", str);  
    ulLength = pStrlenFun(str);   //调用相关的函数  
    printf("The string length is : %d(use Strlen)n", ulLength);  
    ulLength = pStrnlenFun(str, 10);  
    printf("The string length is : %d(use StrNlen)n", ulLength);  
 dlclose(pdlHandle);  
    return 0;  
}  
      
       
</strong></span>

gcc -o mian2 -ldl main2.c

用gcc编译对应的源文件生成可执行文件,-ldl选项,表示生成的对象模块需要使用共享库。执行对应得文件同样可以得到正确的结果。

本文URL地址:http://www.bianceng.cn/OS/Linux/201410/45420.htm

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读