zoukankan      html  css  js  c++  java
  • 灵活使用动态库进行程序开发

    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<error.h>
    #include<errno.h>
    #include<unistd.h>
    #include<strings.h>
    #include<stdbool.h>

    #include<sys/stat.h>
    #include<sys/types.h>
    #include<sys/wait.h>
    #include<fcntl.h>
    #include<dlfcn.h>
    int main(int argc,char **argv)
    {
    if(argc != 2)
    {
    perror("Usage <lib.so>");
    exit(0);
    }
    void *handle = dlopen(argv[1],RTLD_NOW);//打开一个动态库,并返回一个库的句柄
    if(!handle)
    {
    fprintf(stderr,"dlopen()%s failed:%s ",argv[0],strerror(errno));
    exit(0);
    }

    //定义了一个函数指针
    char *(*init)(void) = dlsym(handle,"init_something");//根据句柄获取函数名称,或者全局变量
    printf("%s",init());
    return 0;

    }

    -------------------------------

    vim ts.c
    char *init_something(void)
    {
    return "init ***TS*** ok!! ";
    }

    ----------------------------------------

    vim lcd.c


    char *init_something(void)
    {
    return "init ***lcd*** ok!! ";
    }

    ---------------------------------------

    gcc -o ts.o ts.c -c 

    gcc -shared -fPIC -o libts.so ts.o

    gcc -o lcd.o lcd.c -c 

    gcc -shared -fPIC -o liblcd.so lcd.o

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`

    gcc main.c -o main -ldl  //dlopen dlsym

    ./main libts.so

    --------------------------------

    open
    ==============
    1,可以用来创建普通文件

    - open()
    s socket()
    l link()
    p fifo()
    b mknod()
    c mknod()
    d mkdir()

    2,可以用来打开普通文件、符号链接、命名管道、块设备 、字符设备

    - open()
    s socket() (网络接口设备在/dev下没有对应的节点,无法使用oepn)
    l open()
    p open()
    b open()
    c open()
    d opendir()


    动态编译


    执行如下代码时,根据指定的动态库来初始化不同的东西
    init_something() --> 初始化某些东西


    1,动态库liblcd.so中包含:

    init_something()
    {
    printf("init lcd ");
    }


    2,动态库libts.so中包含:

    init_something()
    {
    printf("init ts ");
    }

    提示:
    dlsym()
    dlopen()


    动态库的静态编译:
    ======================
    gcc main.c -o main -llcd (编译的时候已经指定了动态库,无法改变)

  • 相关阅读:
    org.springframework.beans.factory.BeanCreationException
    线程浅谈
    第五次作业
    第四次作业
    第三次作业
    第二次作业
    第一次作业
    第五次作业
    第三次作业
    第二次作业
  • 原文地址:https://www.cnblogs.com/defen/p/5191171.html
Copyright © 2011-2022 走看看