linux 显式调用 自己写的动态库

~/test
|
|
|------main.c
|------lib
|        |
|        |------StringLen.h
|        |------Strlen.c
|        |------Strnlen.c

----------------StringLen.h:
#ifndef _STRINGLEN_H__
#define _STRINGLEN_H__

int Strlen(char *pStr);
int StrNlen(char *pStr, unsigned long ulMaxLen); 
#endif
-------------------------------------------------

---------------Strlen.c:
#include<stdio.h>
#include<assert.h>
#include "StringLen.h"

int  Strlen(char  *pStr)
{        
    unsigned  long  ulLength;
    assert(NULL  !=  pStr);
    ulLength  =  0;
    while(*pStr++)
    {                
        ulLength++;
    }
    return  ulLength;
}
-------------------------------------------------
---------------Strnlen.c:
#include<stdio.h>
#include<assert.h>
#include "StringLen.h"

int  StrNlen(char  *pStr,  unsigned  long  ulMaxLen)
{        
    unsigned  long  ulLength;
    assert(NULL  !=  pStr);        
    if(ulMaxLen  <=  0)        
    {               
         printf("Wrong  Max  Length!/n");
       return  -1;        
    }       
    ulLength  =  0;        
    while(*pStr++ && ulLength < ulMaxLen)
    {               
        ulLength++;       
    }        
    return  ulLength;
}
-------------------------------------------------

生成动态库:
 gcc -fpic -shared -o libStrlen.so Strlen.c
 gcc -fpic -shared -o libStrnlen.so Strnlen.c
 (生成动态库后,可以将Strlen.c Strnlen.c删除掉)
 
-----------------------main.c:
#include<stdio.h>

#include<dlfcn.h>
#include "StringLen.h"//静态库对应函数的头文件
int main(int  argc,  char*  argv[])
{
    void *pHandle;
    int (*pFunc)(char*);                                /* 指向函数的指针 */
    char str[] = {"hello world"};
    unsigned long ulLength = 0;

    pHandle = dlopen("./lib/libstr.so", RTLD_NOW);         /* 打开动态库*/   

    if (!pHandle)
    {
        printf("Cann't find Strlen.so/n");
        return -1;
    }
    pFunc = (int(*)(char*)) dlsym(pHandle, "Strlen");    /* 获取库函数地址 */
    if (pFunc)             /* 获取库函数对象成功,执行库函数 */
    {
        ulLength = pFunc(str);
        //cout<<ulLength<<endl;
        printf("Strlen:%lu/n",ulLength);
    }
    else                /* 获取库函数对象失败,提示之 */
    {
        printf("Cann't find func Strlen/n");
    }
   
    dlclose(pHandle);     /* 关闭动态库 */


    return 0;

}  
-------------------------------------------------------
//编译main.c

gcc -Wall -I....../test/lib -L...../test/lib  -o test1 main.c  -ldl  (在指定路径时,相对路径和绝对路径都可以)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值