Я генерирую файлы проекта и решения для приложения Windows Forms через cmake.
В папке ресурсов проекта есть несколько файлов .ico, из которых я хочу
выберите my_icon3.ico в качестве значка для моего приложения. Если я открою проект сразу после
создание по cmake, тогда (Default Icon) выбирается, как показано здесь:
Мне нужна команда cmake, которая напрямую устанавливает иконку на my_icon3.ico:
Как мне добиться этого с моим CMakeLists.txt без файла ресурсов?
Спасибо за вашу помощь.
Пожалуйста, найдите здесь пример, чтобы воспроизвести мою проблему:
1) Откройте MS Visual Studio 15 --> Новый --> Проект... --> Приложение Windows Forms
2) Установить имя: я выбрал P0001 и путь --> Ok
3) Создайте папку Resources в исходном каталоге и скопируйте в нее произвольную иконку.
Я выбрал my_icon2.ico и my_icon3.ico.
4) Закрыть MS Visual Studio 15
5) Скопируйте следующий файл CMakeLists.txt в базовый репозиторий:
cmake_minimum_required (VERSION 3.5)
get_filename_component(CMAKE_MODULE_PATH ${CMAKE_COMMAND} DIRECTORY)
include(CSharpUtilities)
#generates the directory structure given in globalDirPath.
#returns all found files (allFiles) - which need to be added to the output
function(AutoGenDirStruct globalDirPath filterF includeParentDirectory allFiles)
if (${includeParentDirectory})
string(FIND ${globalDirPath} "/" startPos REVERSE)
MATH(EXPR startPos "${startPos}+1")
string(SUBSTRING ${globalDirPath} ${startPos} 100 subDir)
string(SUBSTRING ${globalDirPath} 0 ${startPos} globalDir)
AutoGenDirStructInternalOnly(${globalDir} ${subDir})
else()
AutoGenDirStructInternalOnly(${globalDirPath} "")
endif ()
foreach(filter ${${filterF}})
file(GLOB_RECURSE allFilesLocal "${globalDirPath}/${filter}")
set(mergedFiles ${mergedFiles} ${allFilesLocal})
endforeach()
set(${allFiles} ${mergedFiles} PARENT_SCOPE)
endfunction()
function(AutoGenDirStructInternalOnly globalDirPath subDirectoryName)
file(GLOB children RELATIVE "${globalDirPath}/${subDirectoryName}" "${globalDirPath}/${subDirectoryName}/*")
foreach(child ${children})
if (IS_DIRECTORY ${globalDirPath}/${subDirectoryName}/${child})
AutoGenDirStructInternalOnly(${globalDirPath} ${subDirectoryName}/${child})
else()
if (NOT ${subDirectoryName} STREQUAL "")
string(REPLACE "/" "\\" groupname ${subDirectoryName})
source_group(${groupname} FILES ${globalDirPath}/${subDirectoryName}/${child})
endif ()
endif ()
endforeach()
endfunction()
SET(CMAKE_INCLUDE_CURRENT_DIR ON)
SET(CMAKE_CSharp_FLAGS "/langversion:7")
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
project (P0001)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
# Sub-directories where more CMakeLists.txt exist
ADD_SUBDIRECTORY(P0001/SRC)
6) Скопируйте следующий файл CMakeLists.txt в исходный каталог:
cmake_minimum_required (VERSION 3.8)
enable_language(CSharp)
file(GLOB SOURCES
"*.cs"
"*.resx"
)
SET(filter "*.cs" "*.bmp" "*.po" "*.ico" "*.config" "*.settings" "*.resx")
AutoGenDirStruct(${CMAKE_CURRENT_SOURCE_DIR} filter TRUE SOURCES)
csharp_set_designer_cs_properties(${SOURCES})
csharp_set_windows_forms_properties(${SOURCES})
add_executable(P0001 WIN32 ${SOURCES} ${EXTERNAL} ${RES_FILES})
set_target_properties(P0001 PROPERTIES VS_GLOBAL_ROOTNAMESPACE "P0001")
set_property(TARGET P0001 PROPERTY VS_DOTNET_REFERENCES "System;System.Data;System.Configuration;System.Core;System.Data.DataSetExtensions;System.Xml;System.Xml.Linq;System.Windows.Forms;System.Drawing")
set_property(TARGET P0001 PROPERTY FOLDER "Gui")
set_property(TARGET P0001 PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.0")
7) Позвоните cmake, чтобы сгенерировать решение для MS Visual Studio 15, чтобы получить скриншот 1.
Репозиторий моего проекта выглядит следующим образом:
<Base dir>
|--<Build> # folder for cmake
|--CMakeLists.txt # file from 5)
|--<P0001>
| |--<SRC>
| | |--CMakeLists.txt # file from 6)
| | |--<Resources>
| | | |--my_icon3.ico # required icon
Я надеюсь, что вы можете воспроизвести мою проблему?
Я нашел некоторую помощь в сети, но она больше связана с C++:
Установка значка приложения с помощью CMake
либо требуется файл resource:
[CMAKE] Установка значка и для исполняемого файла Windows
[РЕШЕНО] RC-файлы и CMake: проблема с исполняемым значком (Visual Studio)
Неужели нет другого способа настроить это через cmake?
Еще раз спасибо.





Я предполагаю:
set_property(TARGET P0001 PROPERTY VS_GLOBAL_ApplicationIcon "${CMAKE_CURRENT_SOURCE_DIR}/Resources/my_icon3.ico")
сделает работу.
Спасибо, этот параметр свойства в cmake работает так, как нужно.
Спасибо за ссылки, они весьма полезны для моего сценария C++.