Я понял это благодаря комментарию @Developer Paul. CPack и NSIS вводят в заблуждение здесь, потому что различные опции для ссылки на значки и изображения предполагают, что это настройка, которую вы делаете через них. На самом деле значок приложения установлен с файлом ресурсов (.r c) в windows, поэтому у вас есть 3 файла: ваш CMakeLists.txt, Icon.ico и AppIcon.r c.
В вашей CMakeLists.txt ссылка на файл .r c
add_executable("${PROJECT_NAME}" helloworld.cpp AppIcon.rc)
.r c содержит только ссылку на ваш .ico, например:
IDI_ICON1 ICON DISCARDABLE "images/icon.ico"
В моем случае у меня есть отдельная папка images в папке моего проекта. И это в основном все. НО это решение, кажется, работает только для windows, для Linux вы должны сделать это по-другому.