Да, такой инструмент называется компоновщик . Обычно вы запускаете его после компиляции приложения, хотя в большинстве интегрированных сред разработки это выглядит как один шаг с умным именем, например «build».
Другими словами, обручи , которые вы должны перепрыгнуть, чтобы удалить ненужный код и «обфусцировать» его для управляемых языков, таких как C # , абсолютно не нужны для C ++ . Компоновщик будет связывать только те функции, которые использует ваш код, и, поскольку все скомпилировано в двоичный код, он уже запутан настолько, насколько это возможно.
Ничто не собирается связывать содержимое DLL. Весь смысл DLL в том, что на нее динамически ссылается исполняемый файл, поэтому она называется " динамическая библиотека ссылок". Если вам нужна библиотека кода, которая статически связана во время компиляции, вам нужно использовать статическую библиотеку вместо DLL.