Linux操作系统下动态库的编写与调用

    技术2025-04-19  23

    转自:http://blog.csdn.net/pathuang68/archive/2009/06/16/4273904.aspx

    1. 用 c 语言写动态库:

    /*

      * libsthc.h

      * Declarations for function add

      */

    #include "stdio.h"

    #include "stdlib.h"

    #include "stdarg.h"

     

    #ifdef __cplusplus

    extern "C"

    {

    #endif

    int add(int x, int y);

     

    #ifdef __cplusplus

    }

    #endif

     

    /*

      * libsthc.c

      * Implementation of function add declared in libsthc.h

      * in c language

      */

    #include "libsthc.h"

     

    int add(int x, int y)

    {

             return x + y;

    }

     

    #makefile

    libsthc.so:libsthc.o

             gcc -shared libsthc.o -lc -o libsthc.so

    libsthc.o:libsthc.c libsthc.h

             gcc -fPIC -c libsthc.c -o libsthc.o

    all:libsthc.so

    clean:

             rm -f *.o *.so

     

    make 完成后,会生成一个动态库,即 libsthc.so 。为了使其他程序也可以使用该动态库,需要将库文件 libsthc.so 拷贝到 /usr/lib 目录下 ( 由于权限的问题,一般要以 root 的身分进行拷贝 ) ,为了使其他程序也可以使用该动态库,需要将头文件 libsthc.h 拷贝到 /usr/include 目录下 ( 由于权限的问题 , 一般要以 root 的身分进行拷贝 ) 。

     

    1.1 用 c 语言静态方式调用动态库 libsthc.so :

    /*

      * ctest.c

      * Testing program for libsthc.so library

      * in c languange

      * by 玄机逸士

    */

    #include "libsthc.h"

    int main(void)

    {

             printf("%d/n", add(1, 2));

             return 0;

    }

     

    #makefile:

    ctest:ctest.o

             gcc ctest.o -lsthc -o ctest

    ctest.o:ctest.c

             gcc -c ctest.c -o ctest.o

    all:ctest

    clean:

             rm -f *.o ctest

     

    1.2 用 c 语言动态方式调用动态库 libsthc.so :

    /*cdltest.c*/

    #include "stdio.h"

    #include "stdlib.h"

    #include "dlfcn.h"

     

    int main(void)

    {

             void *handle;

             int (*fcn)(int x, int y);

             const char *errmsg;

            

             /* open the library */

             handle = dlopen("libsthc.so", RTLD_NOW);

             if(handle == NULL)

             {

                       fprintf(stderr, "Failed to load libsthc.so: %s/n", dlerror());

                       return 1;

             }

             dlerror();

     

             //*(void **)(&fcn) = dlsym(handle, "add");            //ok

             fcn = dlsym(handle, "add");                                   //ok

             if((errmsg = dlerror()) != NULL)

             {

                       printf("%s/n", errmsg);

                      return 1;

             }

             printf("%d/n", fcn(1, 5));

            

             dlclose(handle);

             return 0;

    }

     

    #makefile :

    cdltest:cdltest.o

             gcc cdltest.o -ldl -lsthc -o cdltest

    cdltest.o:cdltest.c

             gcc -c cdltest.c -o cdltest.o

    all:cdltest

    clean:

             rm -f *.o cdltest

     

    1.3 用 c++ 静态方式调用动态库 libsthc.so :

    /*cpptest.cc*/

    #include "libsthc.h"

    using namespace std;

    int main(void)

    {

             printf("%d/n", add(1, 2));

             return 0;

    }

     

    #makefile:

    cpptest:cpptest.o

             g++ cpptest.o –o cpptest -lsthc

    cpptest.o:cpptest.cc

             g++ -c cpptest.cc -Wno-deprecated -o cpptest.o

    all:cpptest

    clean:

             rm -f *.o cpptest

     

    1.4 用 c++ 动态方式调用动态库 libsthc.so :

    /*cppdltest.cpp*/

    #include "stdio.h"

    #include "stdlib.h"

    #include "dlfcn.h"

     

    int main(void)

    {

             void *handle;

             int (*fcn)(int x, int y);

             const char *errmsg;

            

             /* open the library */

             handle = dlopen("libsthc.so", RTLD_NOW);

             if(handle == NULL)

             {

                       fprintf(stderr, "Failed to load libsthc.so: %s/n", dlerror());

                       return 1;

             }

             dlerror();

     

             *(void **)(&fcn) = dlsym(handle, "add");     //ok

             //fcn = dlsym(handle, "add");                        //not ok in c++

             if((errmsg = dlerror()) != NULL)

             {

                       printf("%s/n", errmsg);

                       return 1;

             }

             printf("%d/n", fcn(1, 5));

            

             dlclose(handle);

             return 0;

    }

     

    #makefile

    cppdltest:cppdltest.o

             g++ cppdltest.o -ldl -lsthc -o cppdltest

    cppdltest.o:cppdltest.cpp

             g++ -c cppdltest.cpp -o cppdltest.o

    all:cppdltest

    clean:

             rm -f *.o cppdltest

     

     

    2. 用 c++ 语言写动态库:

    /*

      * libsthcpp.h

      * Declarations for function cppadd

      */

    #include "stdio.h"

    #include "stdlib.h"

    #include "stdarg.h"

    #ifdef __cplusplus

    extern "C"

    {

    #endif

     

    int cppadd(int x, int y);

    #ifdef __cplusplus

    }

    #endif

     

     

    /*

      * libsthcpp.cpp

      * Implementation of function cppadd declared in libsthcpp.h

      * in c++ language

      */

    #include "libsthcpp.h"

     

    int cppadd(int x, int y)

    {

             return x + y;

    }

     

    #makefile

    libsthcpp.so:libsthcpp.o

             g++ -g -shared -Wl libsthcpp.o -lc -o libsthcpp.so

    libsthcpp.o:libsthcpp.cc libsthcpp.h

             g++ -g -fPIC -c libsthcpp.cc -o libsthcpp.o

    all:libsthcpp.so

    clean:

             rm -f *.o *.so

     

    make 完成后,会生成一个动态库,即 libsthcpp.so 。为了使其他程序也可以使用该动态库,需要将库文件 libsthcpp.so 拷贝到 /usr/lib 目录下 ( 由于权限的问题,一般要以 root 的身分进行拷贝 ) ,为了使其他程序也可以使用该动态库,需要将头文件 libsthcpp.h 拷贝到 /usr/include 目录下 ( 由于权限的问题 , 一般要以 root 的身分进行拷贝 ) 。

     

    2.1 用 c 语言静态方式调用动态库 libsthcpp.so :

    /*

      * ctest.c

      * Testing program for libsthcpp.so library

      * in c languange

      * by 玄机逸士

    */

    #include "libsthcpp.h"

    int main(void)

    {

             printf("%d/n", cppadd(1, 2));

             return 0;

    }

     

    #makefile

    ctest:ctest.o

             gcc ctest.o -lsthcpp -o ctest

    ctest.o:ctest.c

             gcc -c ctest.c -o ctest.o

    all:ctest

    clean:

             rm -f *.o ctest

     

     

    2.2 用 c 语言动态方式调用动态库 libsthcpp.so :

    /*cdltest.c*/

    #include "stdio.h"

    #include "stdlib.h"

    #include "dlfcn.h"

     

    int main(void)

    {

             void *handle;

             int (*fcn)(int x, int y);

             const char *errmsg;

            

             /* open the library */

             handle = dlopen("libsthcpp.so", RTLD_NOW);

             if(handle == NULL)

             {

                       fprintf(stderr, "Failed to load libsthc.so: %s/n", dlerror());

                       return 1;

             }

             dlerror();

     

             //*(void **)(&fcn) = dlsym(handle, "cppadd");       //ok in c and c++

             fcn = dlsym(handle, "cppadd");                               //ok in c, but not in c++

             if((errmsg = dlerror()) != NULL)

             {

                       printf("%s/n", errmsg);

                       return 1;

             }

             printf("%d/n", fcn(1, 5));

            

             dlclose(handle);

             return 0;

    }

     

    #makefile

    cdltest:cdltest.o

             gcc cdltest.o -ldl -lsthcpp -o cdltest

    cdltest.o:cdltest.c

             gcc -c cdltest.c -o cdltest.o

    all:cdltest

    clean:

             rm -f *.o cdltest

     

    2.3 用 c++ 语言静态方式调用动态库 libsthcpp.so :

    /*

      * cpptest.cpp

      * Testing program for libsthc.so library written in c language

      * in c++ languange

      * by 玄机逸士

    */

    #include "libsthcpp.h"

    #include "iostream.h"

    int main(void)

    {

             cout << cppadd(1, 2) << endl;

             return 0;

    }

     

    #makefile

    cpptest:cpptest.o

             g++ cpptest.o -lsthcpp -o cpptest

    cpptest.o:cpptest.cpp

             g++ -c cpptest.cpp -Wno-deprecated -o cpptest.o

    all:cpptest

    clean:

             rm -f *.o cpptest

     

    2.4 用 c++ 语言动态方式调用动态库 libsthcpp.so :

    /*cppdltest.cpp*/

    #include "stdio.h"

    #include "stdlib.h"

    #include "dlfcn.h"

     

    int main(void)

    {

             void *handle;

             int (*fcn)(int x, int y);

             const char *errmsg;

            

             /* open the library */

             handle = dlopen("libsthcpp.so", RTLD_NOW);

             if(handle == NULL)

             {

                       fprintf(stderr, "Failed to load libsthc.so: %s/n", dlerror());

                       return 1;

             }

             dlerror();

     

             *(void **)(&fcn) = dlsym(handle, "cppadd");         //ok in c and c++

             //fcn = dlsym(handle, "cppadd");                             //ok in c, but not in c++

             if((errmsg = dlerror()) != NULL)

             {

                       printf("%s/n", errmsg);

                       return 1;

             }

             printf("%d/n", fcn(1, 5));

            

             dlclose(handle);

             return 0;

    }

     

    #makefile

    cppdltest:cppdltest.o

             g++ cppdltest.o -ldl -lsthcpp -o cppdltest

    cppdltest.o:cppdltest.cpp

             g++ -c cppdltest.cpp -o cppdltest.o

    all:cppdltest

    clean:

             rm -f *.o cppdltest

     

    最新回复(0)