Static and Dynamic/Shared Linking with MinGW
Solution 1:
Please, have a look at ld and WIN32 (cygwin/mingw). Especially, the direct linking to a dll section for more information on the behavior of -l
flag on Windows ports of LD. Extract:
For instance, when ld is called with the argument -lxxx it will attempt to find, in the first directory of its search path,
libxxx.dll.a
xxx.dll.a
libxxx.a
cygxxx.dll (*)
libxxx.dll
xxx.dll
before moving on to the next directory in the search path.
(*) Actually, this is not
cygxxx.dll
but in fact is<prefix>xxx.dll
, where<prefix>
is set by the ld option-dll-search-prefix=<prefix>
. In the case of cygwin, the standard gcc spec file includes-dll-search-prefix=cyg
, so in effect we actually search forcygxxx.dll
.
NOTE: If you have ever built Boost with MinGW, you probably recall that the naming of Boost libraries exactly obeys the pattern described in the link above.
In the past there were issues in MinGW with direct linking to *.dll
, so it was advised to create a static library lib*.a
with exported symbols from *.dll
and link against it instead. The link to this MinGW wiki page is now dead, so I assume that it should be fine to link directly against *.dll
now. Furthermore, I did it myself several times with the latest MinGW-w64 distribution, and had no issues, yet.
You need link flags -Wl,-Bstatic
and -Wl,-Bdynamic
because sometimes you want to force static linking, for example, when the dynamic library with the same name is also present in a search path:
gcc object1.o object2.o -lMyLib2 -Wl,-Bstatic -lMyLib1 -Wl,-Bdynamic -o output
The above snippet guarantees that the default linking priority of -l
flag is overridden for MyLib1
, i.e. even if MyLib1.dll
is present in the search path, LD will choose libMyLib1.a
to link against. Notice that for MyLib2
LD will again prefer the dynamic version.
NOTE: If MyLib2
depends on MyLib1
, then MyLib1
is dynamically linked too, regardless of -Wl,-Bstatic
(i.e. it is ignored in this case). To prevent this you would have to link MyLib2
statically too.