Soit le fichier “shader.cl” à inclure.
Créer une ressource dans Visual Studio.
Aller dans le menu Project
> Add new Item...
. Cliquer sur Show All Templates
et sélectionner Visual C++
> Resource
> Resource File (.rc)
et donner lui un nom de fichier Resource.rc
.
Ce fichier va contenir les liens vers toutes les futures ressources.
Aller dans le menu Project
> Add Resource...
. Cliquer sur Custom…
et indiquer un nom (quelconque), DATA
ici. Dans le gestionnaire de ressources, il suffit alors de lui donner le nom que l'on souhaite ainsi que son identifiant. Le fichier se créera tout seul au moment de l'enregistrement du projet.
Il suffit alors d'ajouter le fichier Resource.rc
dans CMakeLists.txt
de la même façon qu'un fichier .cpp
au code source de l'application / librairie.
add_executable(app WIN32 … Resource.rc)
How to: Create Resources (C++) Archive du 05/11/2021 le 22/05/2023
Embed resources in C++ on Windows (Visual Studio) Archive du 23/06/2018 le 22/05/2023
Il faudra utiliser le nom de la ressource définie dans Visual Studio (ici IDR_DATA1
et accessible depuis le fichier resource.h
).
#include "resource.h" HRSRC hRes = FindResource(nullptr, MAKEINTRESOURCEA(IDR_DATA1), "DATA"); HGLOBAL hData = LoadResource(nullptr, hRes); DWORD hSize = SizeofResource(nullptr, hRes); char* hFinal = (char*)LockResource(hData); std::string kernel; kernel.assign(hFinal, hSize); return kernel;
La ressource existe déjà sous forme d'un fichier.
Générer sa version C via l'outil xxd
.
set(RESOURCE_COMPILER xxd) set(COMPILED_RESOURCES shader.cl) foreach(INPUT_FILE ${COMPILED_RESOURCES}) set(OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${INPUT_FILE}.h) add_custom_command( OUTPUT ${OUTPUT_FILE} COMMAND ${RESOURCE_COMPILER} -i ${INPUT_FILE} ${OUTPUT_FILE} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMMENT "Compiling ${INPUT_FILE} to binary") list(APPEND APP_XXD "${OUTPUT_FILE}") endforeach() add_executable(app WIN32 ... ${APP_XXD})
L'utilisation d'un fichier header est plus simple à utiliser même s'il peut ralentir la compilation s'il fait plusieurs Mo.
Il faut juste adapter le nom des variables en fonction de celui attribué à xxd
.
#include "resource.h" #include <shader.cl.h> #include <map> std::map<int, std::string> res_map = { {IDR_DATA1, {reinterpret_cast<const char*>(shader_cl)}}}; return kernel_map[IDR_DATA1];