В некоторых случаях было бы удобно иметь возможность вырезать все, кроме небольшого количества «экспортируемых» публичных символов, но это не совсем осуществимо.
Статическая библиотека - это нечто большее, чем коллекция файлов .obj. Внутренние зависимости еще не разрешены, и они не будут разрешены до времени ссылки.
Например, если ваш .lib состоит из foo.obj и bar.obj, и в foo.obj есть вызов функции, определенной в bar.obj, то этот символ должен быть доступен во время ссылки, даже если ничего за пределами библиотеки должна быть возможность его увидеть.
По этой причине вы не можете удалить символы (возможно, за исключением статических символов области файла). Даже методы класса, которые являются защищенными или частными (в смысле C ++), будут существовать в таблице символов, поскольку обеспечение видимости - это проблема времени компиляции, а не времени соединения.
Напротив, динамическая библиотека - это отдельный двоичный файл, который уже связан. Ссылки с foo.obj на bar.obj уже разрешены. Таким образом, в DLL можно удалить символы, кроме тех, которые должны быть экспортированы (и даже те, которые могут быть переименованы или заменены на порядковые).
Если ваша DLL предоставляет простой C API, то все готово. Но если вы хотите представить класс C ++, вы, вероятно, в конечном итоге экспортируете все его методы, даже защищенные и закрытые (поскольку встраивание во внешнее приложение может привести к прямым вызовам закрытых методов).