I have a cross platform (win32/unix) project that consist of a C library
and a few example applications using that library. The entire project is
build with autotools. With the instructions from the online autotools
book [1], I managed to build both a Windows DLL and a Unix shared
library. But right now, every non-static function is exported. I would
like to limit that to only the functions that are part of the public api.
It appears there are two options to do that:
1. Using dllexport/dllimport in the source code.
2. Using a DEF file during linking (with -export-symbols flag).
What are the (dis)advantages of each method? I see differences in usage
(see below), but are there technical differences as well?
The first one seems to be the most complicated method, because you need
to be able to distinguish between static/shared library builds, and
export/import in the case of a shared library.
For the second one, you need to maintain a separate list of all the
public functions. However in my case, this list is not static and can
change depending on a number of external factors that are detected in
the configure script (such as the target platform). I found a solution
for that by #ifdef's in the file and running the C preprocessor over it.
Note: It should also be possible to compile the dll with an msvc
compiler on Windows, and link a mingw32 compiled dll in an msvc
application. I don't know if that makes a difference.
[1] http://sourceware.org/autobook/autobook/autobook_251.html#SEC251