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