- 论坛徽章:
- 0
|
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":
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html
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:
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/86325/showart_1932804.html |
|