Outils pour utilisateurs

Outils du site


lang:c:embed

Soit le fichier “shader.cl” à inclure.

Windows

Création de la ressource

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

Récupération des données

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;

Linux

Création de la ressource

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})

Récupération des données

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];
lang/c/embed.txt · Dernière modification : 2023/05/22 17:11 de root