现在的位置: 首页 > 综合 > 正文

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

2014年01月13日 ⁄ 综合 ⁄ 共 2119字 ⁄ 字号 评论关闭

~/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  (在指定路径时,相对路径和绝对路径都可以)

抱歉!评论已关闭.