What is the Microsoft Visual Studio equivalent to GCC ld option --whole-archive

fschmitt picture fschmitt · Oct 5, 2010 · Viewed 8.2k times · Source

When linking a static library against an executable, unreferenced symbols are normally discarded. In my case some otherwise unused objects are used to register their respective classes into a factory and if the objects are discarded, this registration fails.

Under Unix where we use gcc, I can pass the flag --whole-archive to the linker ld (see excerpt from ld documentation below), which makes ld not discard any objects. Is there anything like this for Visual C++?

--whole-archive

    For each archive mentioned on the command line after the
    `--whole-archive' option, include every object file in the archive
    in the link, rather than searching the archive for the required
    object files. This is normally used to turn an archive file into
    a shared library, forcing every object to be included in the
    resulting shared library. This option may be used more than once.

Answer

mrry picture mrry · Sep 27, 2016

The version of Visual C++ in Visual Studio 2015 Update 2 includes a new flag to link.exe called /WHOLEARCHIVE, which has equivalent functionality to the --whole-archive option to ld. According to the flag documentation:

The /WHOLEARCHIVE option forces the linker to include every object file from either a specified static library, or if no library is specified, from all static libraries specified to the LINK command.