I attempted to build a win32 static library using the i686-w64-mingw32
cross-build toolchain.
I built the object files and the mylib.lib
file via a Makefile:
$(program_RELEASE_NAME_WIN_STATIC): $(RELEASE_OBJS_WIN32_STATIC)
i686-w64-mingw32-gcc-ar rcs $(BUILD_DIR_WIN32)/static/$@ $^
$(BUILD_DIR_WIN32)/static/%.o: %.c $(HEADERS)
$(RELEASE_LINK_WIN32.c) $< -c -o $@
This gave me the static library mylib.lib
. Inspecting this on the linux side with nm
I can see all the constituent object files and the functions they contain
No when I inspect mylib.lib
on a windows 10 VM, i.e.
DUMPBIN /EXPORTS mylib.lib
I get:
Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.
Dump of file mylib.lib
File Type: LIBRARY
Summary
C .bss
C .data
6AC .drectve
5EAC .rdata
444 .rdata$zzz
29900 .text
38 .text.unlikely
None of the functions are being exported.
In the relevant header file I mark up the functions I want to export with __declspec(dllexport)
This worked fine when I was producing a .dll, i.e. the functions I marked for export were the only ones that were visible in the .dll file
But for the static library equivalent nothing is being exported?
How are you meant to make functions visible in a win32 .lib file?
dumpbin /exports
lists the symbols exported by an executable or DLL. See the DUMPBIN options documentationA static library isn't an executable or DLL. It's just a bag of object files in Unix
ar
archive format (which is the same MSLIB
format).dumpbin
analyses COFF binaries. When you run:it analyses each object file in
static.lib
according to/option...
. But:will never report any exports in the object file
file.obj
because an object file isn't an executable or DLL either. It has no dynamic symbol stable. Only an executable or DLL can expose symbols for dymamic linkage: it is supplied with its dynamic symbol table when it is generated by the linker, which has no hand in producing either an object file or static library.If you now build an executable or DLL that links any function from your static library that you have qualified with
__declspec(dllexport)
in the library's header file, then the linker will add that function to the dynamic symbol table of the output executable or DLL, and if you thendumpbin /exports
on that executable or DLL, you will see that the function is reported.An object file may define global symbols. A global symbol (a.k.a public/external symbol) may or may not be exported for dynamic linkage, depending on whether it is qualified
__declspec(dllexport)
or not. A symbol must be global to be a DLL export.If you run
dumpbin /symbols
on your static library, that will report all the symbols in all the object files in the static library, and will classify them asExternal
orStatic
. The symbols that you have qualified as__declspec(dllexport)
will appear amoung theExternal
symbols listed.