How to create shared libraries / dlls?


The precise method for creating shared libraries varies between
different systems. There are two main parts to the process; firstly the
objects to be included in the shared library must be compiled, usually
with options to indicate that the code is to be position-independent;
secondly, these objects are linked together to form the library.



Here's a trivial example that should illustrate the idea:




/* file shrobj.c */

const char *myfunc()
{
return "Hello World";
}

/* end shrobj.c */

/* file hello.c */

#include <stdio.h>

extern const char *myfunc();

main()
{
printf("%s\n", myfunc());
return 0;
}

/* end hello.c */

$ gcc -fpic -c shrobj.c
$ gcc -shared -o libshared.so shrobj.o
$ gcc hello.c libshared.so
$ ./a.out
Hello World




By far the best method if you want the library and build procedure to be
anything approaching portable is to use GNU Libtool. This is a small
suite of utilities which know about the platform-dependent aspects of
building shared libraries; you can distribute the necessary bits with
your program, so that when the installer configures the package, he or
she can decide what libraries to build. Libtool works fine on systems
which do not support shared libraries. It also knows how to hook into
GNU Autoconf and GNU Automake (if you use those tools to manage your
program's build procedure).



If you don't want to use Libtool, then for compilers other than gcc, you
should change the compiler options as follows:




AIX 3.2 using xlc (unverified)

Drop the `-fpic', and use `-bM:SRE -bE:libshared.exp' instead of
`-shared'. You also need to create a file `libshared.exp'
containing the list of symbols to export, in this case `myfunc'.
In addition, use `-e _nostart' when linking the library (on newer
versions of AIX, I believe this changes to `-bnoentry').

SCO OpenServer 5 using the SCO Development System (unverified)

Shared libraries are only available on OS5 if you compile to ELF format,
which requires the `-belf' option. Use `-Kpic' instead of
`-fpic', and `cc -belf -G' for the link step.

Solaris using SparcWorks compilers

Use `-pic' instead of `-fpic', and use `ld -G' instead of
`gcc -shared'.



(Submission of additional entries for the above table is encouraged.)



Other issues to watch out for:







[an error occurred while processing this directive]