Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153062
  • 博文数量: 25
  • 博客积分: 2011
  • 博客等级: 大尉
  • 技术积分: 280
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-22 23:16
文章存档

2009年(22)

2008年(3)

我的朋友

分类: LINUX

2009-05-19 11:01:17

 Compile DLL:
$CXX -Wall -fPIC -I$PATH_INCLUDE -L$PATH_LIB  -c *.cpp
$CXX -shared -I$PATH_INCLUDE -L$PATH_LIB -lotherlibname  -Wl,-soname,libctest.so -o libctest.so   *.o

ctest.h:

// Class factory "C" functions
//----------------------------------------------------------------------
// construct and destruct the object. 
//----------------------------------------------------------------------
typedef Abc* create_t();
typedef void destroy_t(Abc*);


Compile  a App with DLL:
main.cpp:

    void *lib_handle;
    char *error;
   
error_handle:
    if (func_num > 0)
    {
      fprintf(stderr, "func_num=%d, %s\n", func_num, error);
      exit(1);
    }

    lib_handle = dlopen("libVLCMedia.so", RTLD_LAZY);
    if ((error = dlerror()) != NULL) 
        goto error_handle;

    //create
    create_t *createM = (create_t *) dlsym(lib_handle, "create");
    if ((error = dlerror()) != NULL) 
        goto error_handle;

    Abc *abcM = createM();

    //  destroy.
    //destroy
    destroy_t *destroyM = (destroy_t *)dlsym(lib_handle, "destroy");
    if ((error = dlerror()) != NULL) 
        goto error_handle;

    destroyM(abcM);
   
    //  dlclose
    dlclose(lib_handle);


Compile Method 1:
$CXX *.cpp -o test -I$PATH_INCLUDE -I.   -lctest -L$PATH_LIB -lotherlibname   -lz -lm -lrt -ldl -lpthread

Method 2:
$CXX  -rdynamic *.cpp -o test -I$PATH_INCLUDE -I.  -L$PATH_LIB -lotherlibname   -lz -lm -lrt -ldl -lpthread




Links:
"Writing DLLs for Linux apps":
http://www.ibm.com/developerworks/linux/library/l-dll.html 

"Static, Shared Dynamic and Loadable Linux Libraries":



Main Ideas:

1.
Dynamically Linked "Shared Object" Libraries: (.so)

How to generate a shared object: (Dynamically linked object library
file.) Note that this is a two step process.

     1. Create object code
     2. Create library
     3. Optional: create default version using a symbolic link.
Library creation example:
        gcc -Wall -fPIC -c *.c
            gcc -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0   *.o
            mv libctest.so.1.0 /opt/lib
            ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so
            ln -sf /opt/lib/libctest.so.1.0 /opt/lib/libctest.so.1
                 
        This creates the library libctest.so.1.0 and symbolic links to
        it.
       
        Compiler options:
       
              * -Wall: include warnings. See man page for warnings
                specified.
              * -fPIC: Compiler directive to output position independent
                code, a characteristic required by shared libraries.
                Also see "-fpic".
              * -shared: Produce a shared object which can then be
                linked with other objects to form an executable.
              * -W1: Pass options to linker.
                In this example the options to be passed on to the
                linker are: "-soname libctest.so.1". The name passed
                with the "-o" option is passed to gcc.
              * Option -o: Output of operation. In this case the name of
                the shared object to be output will be
                "libctest.so.1.0"
       
        Library Links:
       
              * The link to /opt/lib/libctest.so allows the naming
                convention for the compile flag -lctest to work.
              * The link to /opt/lib/libctest.so.1 allows the run time
                binding to work. See dependency below.

Compile main program and link with shared object library:


        Compiling for runtime linking with a dynamically linked
        libctest.so.1.0:
        gcc -Wall -I/path/to/include-files -L/path/to/libraries prog.c -lctest -o prog
        Use:
            gcc -Wall -L/opt/lib prog.c -lctest -o prog
             
        Where the name of the library is libctest.so. (This is why you
        must create the symbolic links or you will get the error
        "/usr/bin/ld: cannot find -lctest".)
        The libraries will NOT be included in the executable but will be
        dynamically linked during runtime execution.
       
Run Program:

      * Set path: export LD_LIBRARY_PATH=/opt/lib:$LD_LIBRARY_PATH
      * Run: prog

2. Details to refer:
Dynamic loading and un-loading of shared libraries using libdl:
C++ class objects and dynamic loading:
Dynamic loading of C++ classes:

阅读(1364) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~