linux 下 动态库的编写和使用

第一个例子

编写头文件

mylib.h

#include <stdio.h>


编写库文件

mylib.c

void Print();
#include "mylib.h"

void Print()
{
    printf("This is in my first dynamic lib call");
}

编写测试代码

main.c

#include "mylib.h"

int main()
{
    Print();
}

编写README

gcc -shared -fPIC mylib.c -o libcac.so
gcc -fpic -shared mylib.c -o mylib.so
–fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

–shared:指明编译成动态库。

gcc -o main main.c -L./ mylib.so
gcc -o main test.c -L./ ./mylib.so


第二个例子


编写头文件

#ifndef _GETMAXLEN_H_

#define _GETMAXLEN_H_

int getMaxLen(int *sel,int N);

#endif


编写库文件

#include "getmaxlen.h"

int getMaxLen(int *sel,int N)

{

    int n1=1,n2=1, i=1;
    
    for(i;i<N;i++)

    {

        if(sel[i]>sel[i-1])

        {

            n2 ++;

            if(n2 > n1)

            {

                n1 = n2;

            }

        }

        else

        {

            n2 = 1;

        }

    }

    return n1;

}


编写测试代码

#include "getmaxlen.h"
#include<stdio.h>
int main()

{

    int Sel[] = {2,3,6,5,3,2,1,2,3,4,5,6,7,6,5};

    int m;

    m = getMaxLen(Sel,15);

    printf("%d",m);

    return 0;

}

动态加载库文件

#include "getmaxlen.h"
#include<stdio.h>
#include<dlfcn.h>

int main()

{

    void *handle = NULL;

    int (*getMaxLen)(int *sel,int N);

    int sel[] = {1,2,5,4,5,8,6,5,9,5,4,5,4,1};

    handle = dlopen("./mylib.so",RTLD_LAZY);

    if(handle == NULL)

    {

        printf("dll loading error.\n");

        return 0;

    }

    getMaxLen = (int(*)(int *,int))dlsym(handle,"getMaxLen");

    if(dlerror()!=NULL)

    {

        printf("fun load error.\n");

        return 0;

    }

    printf("%d\n",getMaxLen(sel,15));

}


编写README

gcc -shared -fPIC mylib.c -o libcac.so
gcc -fpic -shared mylib.c -o mylib.so
–fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

–shared:指明编译成动态库。

gcc -o main main.c -L./ mylib.so
gcc -o main test.c -L./ ./mylib.so

gcc -fpic -shared getmaxlen.c  -o mylib.so(动态加载库文件使用)





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值