Вопрос очень на самом деле сложный.
Помимо умения писать программы, разработчик должен уметь настраивать свое рабочее окружение.
Зачастую, если пользуешься какой-нибудь средой разработки (IDE, например Microsoft Visual Studio) то за сборку exe файла и всего проекта будет отвечать она, а пользователю в мышевозекательном интерфейсе дается возможность настроить все необходимое.
Например создавая проект "Консольное приложение c++" (название приблизительное, не помню точно уже) проект будет автоматически настроен на сборку консольного приложения, лишних библиотек не подключено и т.п. Мало того, возможно понадобится собрать приложение сразу для нескольких архитектур (x86 и x86_64 например), т.е. по набору exe/dll на каждую архитектуру, и бывают случаи когда даже файлы баз данных не переносимы и потребуют свои для каждой.
После сборки всех необходимых exe и dll (есть есть) нужна программа установщик, созданная из твоего приложения, в которую будут собраны все необходимые файлы, exe, dll и стартовые настройки... обычно эта программа представляет из себя один файл архив в особом формате.
В самых простых случаях, когда на целевой машине даже не надо создавать ярлык (просто распаковать и все), можно воспользоваться каким-нибудь self extracted archive (у winrar такая опция есть). Иногда инструменты для создания такого пакета есть в самой IDE (точно помню у visual studio для managed .net кода такое было), а иногда это стороннее приложение, для windows рекомендую попробовать
inno setup, позволяет создавать не только exe установщик но и msi (специализированный формат windows для установочных архивов), это приложение позволяет описывать процесс установки в виде некоторого языка, не заморачиваясь с интерфейсом.
p.s. windows нет прямого ограничения по запуску приложений без установки, т.е. просто копируй вручную exe файл и все
upd. для с++ добавляется еще один челедж, решить, каким компилятором собирать, какими стандартами (стандарт реализация эксепшен try/catch/throw, формат имен подключаемых dll и т.п.), какими базовыми библиотеками (например какая будет использоваться libc) и даже для какой версии ОС собираешь (например собрав под последнюю win10 приложение может не запуститься на win7 или winxp, потому что будет требовать несовместимую версию visual studio redistributable (vcredist*.exe этот пакет обновлений таскают с собой все кому не лень, и кстати по лицензии делать это без разрешения майкрософт низязя)
Так уж исторически сложилось, что нормально тулчейн найти под windows можно либо:
* gcc (gnu c compiler) - задает всем остальным, тут полнее реализуют новые стандарты, работает во всех ОС, но при этом есть windows сборка (смотреть у mingw кстати она есть по до все ос, позволяет кросскомпиляцию типа из linux собрать windows exe) а есть cygwin (несовместимая ни с чем, но качественно повторяет linux стандарты)
Поговаривают что mingw все, кончился :(
* microsoft visual c++ compiler (идет с visual studio), пытается задавать свои ни с чем не совместимые стандарты, корежит существующие, с целью создать хаос и привязать разработчиков только к windows
и это у майкрософт получается, к сожалению
* llvm и clang (это отдельные проекты но когда говорят об одном то и о другом), стандарт стоит особняком, так как llvm это некая виртуальная машина, с очень эффективной реализацией, с jit и оптимизациями
настроить на windows это еще надо уметь, но есть возможность прописать для использовании в visual studio!