a2dll is shell script (see requirements) to automotize process of converting existing static libraries (produced by gnu-win32 tools, of course) into DLL. First of all, yes it's possible: if you have binary static distribution of some library (i.e. library itself and its headers), that's all you need to convert it to DLL and use in your programs. Read HOWTO for underlying magic. So, you may not waste time if you need DLL: just grab existing static distribution and convert. Also, you may use it to build Win32 DLL of your library. Also, until GNU libtool will allow seamless building of Win32 DLLs, you may build static lib (what libtool of course supports) and then convert it to DLL.
a2dll <static_lib> [-o <dll_name>] [<linker_flags>] [--relink]where:
a2dll works in following way:
Since converting static libraries to DLLs is not fully automated and formal process, some experience with it is required. Learing by example is known to be one of the efficient way of communicating experince, so I would like to provide some realistic examples of converting statics to DLLs with the help of a2dll.
Build libz.a . Now, run 'a2dll libz.a'. It builds cleanly, but warns us about data symbols. Let's look at them:
What they could be. The first one is probably some internal variable, while second is probably array of error messages. As we know, zlib provides functional way of getting error messages, something like. So our hypothesis is that job's done. Let's prove it: 'grep -f z.dll.data zlib.h'. Yes, we're right: no mentioning of those symbols in interface header file.inflate_mask z_errmsg
I've got an idea to DLLize libstdc++ coming with my mingw32 distribution. 'a2dll "libstdc++.a"'. Note that we don't use --driver-name=g++ - that option need to be used when we link something against libstdc++ . But when we link libstdc++ itself, we need libc (whatever it is in mingw32), nothing else. But, process aborts due to linker errors. ld.err tells us:
Well, strerror, vfork, waitpid are libc functions, what they do in libstdc++? Probably, stubs, delete them and 'a2dll "libstdc++.a" --relink'. Of course, stdc++.dll.data is here. Looking into it, I may tell you that everything starting with '__ti<digit>' is RTTI internal data structures and everything starting with '_vt$' is virtual tables (use c++filt if in doubt), you can leave them alone. (If so, why I don't filter them? Because "you can leave them alone" is hypothesis for now, I haven't linked too much C++ libraries to be sure). From the rest, there's stuff starting with '_IO_'. That's probably some internal variables, let's don't do anything about them, unless we'll be forced to. Than, as c++filt shows, there're some static members of templated classes. Darkness. Forget for now. Than, there's 'io_defs__'. Does your C++ application reference something like that? Mine not. So, what is left? Our four happy friends, cin, cout, cerr, and clog. Do mark them as __declspec(dllimport) in iostream.h.strerror.o(.text+0x303): undefined reference to `sys_nerr' vfork.o(.text+0x7): undefined reference to `fork' waitpid.o(.text+0x15): undefined reference to `wait'
Suppose we have following file:
#include <iostream.h> void foo() { cout<<"hi!"<<endl; }and want to turn it into DLL. Create static liba.a from it. Now, 'a2dll liba.a --driver-name=g++'. Well, our DLL contains single function, why then it complains about data symbols? Oh, it's those stupid RTTI structures. Next time, compile with -fno-rtti unless you really need it, ok? Ditto for -fno-exceptions .
a2dll requires POSIX shell (sh) to run. It is developed and tested with ash from PW32 distribution. Additionally, a2dll requires following utilities to perform its tasks: