{"id":37084,"date":"2019-10-31T22:15:40","date_gmt":"2019-10-31T19:15:40","guid":{"rendered":"https:\/\/prohoster.info\/blog\/c-i-cmake-bratya-navek-chast-ii\/"},"modified":"2019-10-31T22:15:40","modified_gmt":"2019-10-31T19:15:40","slug":"c-i-cmake-bratya-navek-chast-ii","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/c-i-cmake-bratya-navek-chast-ii","title":{"rendered":"C++ et CMake \u2014 des fr\u00e8res pour toujours, partie II","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"C++ et CMake \u2014 des fr\u00e8res pour toujours, partie II\" src=\"\/wp-content\/uploads\/2019\/08\/1d86b8b1668ae29ff3e634df9059d9b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/461817\/\">Dans la partie pr\u00e9c\u00e9dente<\/a><\/noindex> de ce r\u00e9cit captivant, il a \u00e9t\u00e9 question de l'organisation d'une biblioth\u00e8que d'en-t\u00eates dans le cadre du g\u00e9n\u00e9rateur de syst\u00e8mes de construction CMake.<\/p>\n<p><\/p>\n<p>Cette fois, nous allons y ajouter une biblioth\u00e8que compilable et parler de l'assemblage des modules entre eux.<\/p>\n<p><\/p>\n<blockquote><p>Comme auparavant, ceux qui ne peuvent pas attendre peuvent directement <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/izvolov\/mylib\">passer au d\u00e9p\u00f4t mis \u00e0 jour<\/a><\/noindex> et essayer tout par eux-m\u00eames.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"contents\"><\/a><\/noindex><\/p>\n<h2>Contenu<\/h2>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"#divide\">S\u00e9parez<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#impera\">Dominez<\/a><\/noindex><\/li>\n<\/ol>\n<p>\n<noindex><a rel=\"nofollow\" name=\"divide\"><\/a><\/noindex><\/p>\n<h2><noindex><a rel=\"nofollow\" href=\"#contents\">S\u00e9parez<\/a><\/noindex><\/h2>\n<p><\/p>\n<p>La premi\u00e8re chose \u00e0 faire pour atteindre notre grand objectif est de diviser le logiciel en blocs isol\u00e9s et universels, uniformes du point de vue de l'utilisateur.<\/p>\n<p><\/p>\n<p>Dans la premi\u00e8re partie, un type de bloc standard a \u00e9t\u00e9 d\u00e9crit : un projet avec une biblioth\u00e8que d'en-t\u00eates. Maintenant, ajoutons une biblioth\u00e8que compilable \u00e0 notre projet.<\/p>\n<p><\/p>\n<p>Pour cela, nous allons extraire l'impl\u00e9mentation de la fonction <code>myfunc<\/code> dans un fichier distinct <code>.cpp<\/code>-fichier :<\/p>\n<p><\/p>\n<pre><code class=\"diff\">diff --git a\/include\/mylib\/myfeature.hpp b\/include\/mylib\/myfeature.hpp\nindex 43db388..ba62b4f 100644\n--- a\/include\/mylib\/myfeature.hpp\n+++ b\/include\/mylib\/myfeature.hpp\n@@ -46,8 +46,5 @@ namespace mylib\n\n         ~  voir mystruct\n      *\/\/\n-    inline bool myfunc (mystruct)\n-    {\n-        return true;\n-    }\n+    bool myfunc (mystruct);\n }\ndiff --git a\/src\/mylib\/myfeature.cpp b\/src\/mylib\/myfeature.cpp\nnew file mode 100644\nindex 0000000..abb5004\n--- \/dev\/null\n+++ b\/src\/mylib\/myfeature.cpp\n@@ -0,0 +1,9 @@\n+#include \n+\n+namespace mylib\n+{\n+    bool myfunc (mystruct)\n+    {\n+        return true;\n+    }\n+}<\/code><\/pre>\n<p><\/p>\n<p>Ensuite, nous allons d\u00e9finir la biblioth\u00e8que compilable (<code>myfeature<\/code>), qui consistera en le fichier obtenu \u00e0 l'\u00e9tape pr\u00e9c\u00e9dente. \u00c9videmment, la nouvelle biblioth\u00e8que a besoin des en-t\u00eates existants, et pour cela, il est possible et n\u00e9cessaire de la lier \u00e0 la cible existante <code>.cpp<\/code>mylib <code>. De plus, le lien entre eux est public, ce qui signifie que tout ce \u00e0 quoi la cible sera connect\u00e9e obtiendra \u00e9galement en charge la cible<\/code>plus d'informations sur les m\u00e9thodes de liaison <code>myfeature<\/code>diff --git a\/CMakeLists.txt b\/CMakeLists.txt\nindex 108045c..0de77b8 100644\n--- a\/CMakeLists.txt\n+++ b\/CMakeLists.txt\n@@ -64,6 +64,17 @@ target_compile_features(mylib INTERFACE cxx_std_17)\n\n add_library(Mylib::mylib ALIAS mylib)\n\n+###################################################################################################\n+##\n+##      Biblioth\u00e8que compilable\n+##\n+###################################################################################################\n+\n+add_library(myfeature src\/mylib\/myfeature.cpp)\n+target_link_libraries(myfeature PUBLIC mylib)\n+\n+add_library(Mylib::myfeature ALIAS myfeature)\n+ <code>. De plus, le lien entre eux est public, ce qui signifie que tout ce \u00e0 quoi la cible sera connect\u00e9e obtiendra \u00e9galement en charge la cible<\/code> (<noindex><a rel=\"nofollow\" href=\"https:\/\/cmake.org\/cmake\/help\/v3.14\/command\/target_link_libraries.html#libraries-for-a-target-and-or-its-dependents\">Ensuite, nous allons veiller \u00e0 ce que la nouvelle biblioth\u00e8que soit \u00e9galement install\u00e9e dans le syst\u00e8me :<\/a><\/noindex>). <\/p>\n<p><\/p>\n<pre><code class=\"diff\">@@ -72,7 +83,7 @@ add_library(Mylib::mylib ALIAS mylib)\n\n install(DIRECTORY include\/mylib DESTINATION include)\n\n-install(TARGETS mylib EXPORT MylibConfig)\n+install(TARGETS mylib myfeature EXPORT MylibConfig)\n install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share\/Mylib\/cmake)\n\n include(CMakePackageConfigHelpers)<\/code><\/pre>\n<p><\/p>\n<p>Ensuite, nous allons faire en sorte que la nouvelle biblioth\u00e8que soit \u00e9galement install\u00e9e dans le syst\u00e8me :<\/p>\n<p><\/p>\n<pre><code class=\"diff\">@@ -72,7 +83,7 @@ add_library(Mylib::mylib ALIAS mylib)\n\n install(DIRECTORY include\/mylib DESTINATION include)\n\n-install(TARGETS mylib EXPORT MylibConfig)\n+install(TARGETS mylib myfeature EXPORT MylibConfig)\n install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share\/Mylib\/cmake)\n\n include(CMakePackageConfigHelpers)<\/code><\/pre>\n<p><\/p>\n<p>Il est important de noter que, pour l'objectif <code>myfeature<\/code>, tout comme pour <code>. De plus, le lien entre eux est public, ce qui signifie que tout ce \u00e0 quoi la cible sera connect\u00e9e obtiendra \u00e9galement en charge la cible<\/code> , un alias a \u00e9t\u00e9 cr\u00e9\u00e9 avec le pr\u00e9fixe <code>Mylib::<\/code>. Il en va de m\u00eame pour les deux objectifs lors de leur exportation pour une installation dans le syst\u00e8me. Cela permet un travail uniforme avec les objectifs dans n'importe quel <noindex><a rel=\"nofollow\" href=\"#impera\">sch\u00e9ma de liaison<\/a><\/noindex>.<\/p>\n<p><\/p>\n<p>Apr\u00e8s cela, il reste \u00e0 int\u00e9grer les tests modulaires avec la nouvelle biblioth\u00e8que (la fonction <code>myfunc<\/code> a \u00e9t\u00e9 retir\u00e9e de l'en-t\u00eate, donc il faut maintenant se lier) :<\/p>\n<p><\/p>\n<pre><code class=\"diff\">diff --git a\/test\/CMakeLists.txt b\/test\/CMakeLists.txt\nindex 5620be4..bc1266c 100644\n--- a\/test\/CMakeLists.txt\n+++ b\/test\/CMakeLists.txt\n@@ -4,7 +4,7 @@ add_executable(mylib-unit-tests test_main.cpp)\n target_sources(mylib-unit-tests PRIVATE mylib\/myfeature.cpp)\n target_link_libraries(mylib-unit-tests\n     PRIVATE\n-        Mylib::mylib\n+        Mylib::myfeature\n         doctest::doctest\n )<\/code><\/pre>\n<p><\/p>\n<p>Les en-t\u00eates (<code>Mylib::mylib<\/code>) n'ont plus besoin d'\u00eatre inclus s\u00e9par\u00e9ment, car, comme mentionn\u00e9 pr\u00e9c\u00e9demment, ils sont connect\u00e9s automatiquement avec la biblioth\u00e8que (<code>Mylib::myfeature<\/code>).<\/p>\n<p><\/p>\n<p>Et ajoutons quelques nuances pour assurer les mesures de couverture en tenant compte de la nouvelle biblioth\u00e8que :<\/p>\n<p><\/p>\n<pre><code class=\"diff\">@@ -15,11 +15,16 @@ if(MYLIB_COVERAGE AND GCOVR_EXECUTABLE)\n     target_compile_options(mylib-unit-tests PRIVATE --coverage)\n     target_link_libraries(mylib-unit-tests PRIVATE gcov)\n\n+    target_compile_options(myfeature PRIVATE --coverage)\n+    target_link_libraries(myfeature PRIVATE gcov)\n+\n     add_custom_target(coverage\n         COMMAND\n             ${GCOVR_EXECUTABLE}\n-                --root=${PROJECT_SOURCE_DIR}\/include\/\n-                --object-directory=${CMAKE_CURRENT_BINARY_DIR}\n+                --root=${PROJECT_SOURCE_DIR}\/\n+                --filter=${PROJECT_SOURCE_DIR}\/include\n+                --filter=${PROJECT_SOURCE_DIR}\/src\n+                --object-directory=${PROJECT_BINARY_DIR}\n         DEPENDS\n             check\n     )<\/code><\/pre>\n<p><\/p>\n<p>On peut ajouter plus de biblioth\u00e8ques, d'ex\u00e9cutables, etc. Peu importe comment ils sont li\u00e9s entre eux dans le cadre du projet. Ce qui est important, ce sont les cibles qui constituent l'interface de notre module, c'est-\u00e0-dire celles qui sont expos\u00e9es \u00e0 l'ext\u00e9rieur.<\/p>\n<p>\n<noindex><a rel=\"nofollow\" name=\"impera\"><\/a><\/noindex><\/p>\n<h2><noindex><a rel=\"nofollow\" href=\"#contents\">Dominez<\/a><\/noindex><\/h2>\n<p><\/p>\n<p>Nous avons maintenant des modules-blocs standards, et nous pouvons les contr\u00f4ler : construire une structure de toute complexit\u00e9, les installant dans le syst\u00e8me ou les reliant entre eux dans une seule syst\u00e8me de construction.<\/p>\n<p><\/p>\n<h3 id=\"ustanovka-v-sistemu\">Installation dans le syst\u00e8me<\/h3>\n<p><\/p>\n<p>Une des fa\u00e7ons d'utiliser le module consiste \u00e0 installer notre module dans le syst\u00e8me.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">cmake --build chemin\/vers\/le\/r\u00e9pertoire\/de\/construction --target install<\/code><\/pre>\n<p><\/p>\n<p>Apr\u00e8s cela, il peut \u00eatre int\u00e9gr\u00e9 dans tout autre projet \u00e0 l'aide de la commande <noindex><a rel=\"nofollow\" href=\"https:\/\/cmake.org\/cmake\/help\/v3.14\/command\/find_package.html\"><code>find_package<\/code><\/a><\/noindex>.<\/p>\n<p><\/p>\n<pre><code class=\"cmake\">find_package(Mylib 1.0 REQUIRED)<\/code><\/pre>\n<p><\/p>\n<h3 id=\"podklyuchenie-v-kachestve-podmodulya\">Int\u00e9gration en tant que sous-module<\/h3>\n<p><\/p>\n<p>Une autre option consiste \u00e0 int\u00e9grer le dossier de notre projet dans un autre projet en tant que sous-module \u00e0 l'aide de la commande <noindex><a rel=\"nofollow\" href=\"https:\/\/cmake.org\/cmake\/help\/v3.14\/command\/add_subdirectory.html\"><code>add_subdirectory<\/code><\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"ispolzovanie\">Utilisation<\/h3>\n<p><\/p>\n<p>Les m\u00e9thodes de liaison sont diff\u00e9rentes, mais le r\u00e9sultat est le m\u00eame. Dans les deux cas, dans un projet utilisant notre module, des cibles seront disponibles. <code>Mylib::myfeature<\/code> et <code>Mylib::mylib<\/code>, qui peuvent \u00eatre utilis\u00e9es, par exemple, de cette mani\u00e8re :<\/p>\n<p><\/p>\n<pre><code class=\"cmake\">add_executable(some_executable some.cpp sources.cpp)\ntarget_link_libraries(some_executable PRIVATE Mylib::myfeature)<\/code><\/pre>\n<p><\/p>\n<p>Dans notre cas sp\u00e9cifique, la biblioth\u00e8que <code>Mylib::myfeature<\/code> doit \u00eatre int\u00e9gr\u00e9e lorsque vous devez lier avec la biblioth\u00e8que <code>libmyfeature.<\/code>S'il suffit d'en-t\u00eates, il est alors pr\u00e9f\u00e9rable d'utiliser la biblioth\u00e8que. <code>Mylib::mylib<\/code>.<\/p>\n<p><\/p>\n<p>Les cibles CMake peuvent \u00eatre astucieuses, par exemple, destin\u00e9es uniquement \u00e0 faire passer certaines propri\u00e9t\u00e9s, d\u00e9pendances, etc. Cependant, le travail avec elles se fait de mani\u00e8re uniforme.<\/p>\n<p><\/p>\n<p>Ce qui \u00e9tait recherch\u00e9.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/463295\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c \u043e\u0431 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0438 CMake. \u0412 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a \u043d\u0435\u043c\u0443 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u043a\u043e\u043c\u043f\u043e\u043d\u043e\u0432\u043a\u0435 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c. \u041a\u0430\u043a \u0438 \u043f\u0440\u0435\u0436\u0434\u0435, \u0442\u0435\u043c, \u043a\u043e\u043c\u0443 \u043d\u0435 \u0442\u0435\u0440\u043f\u0438\u0442\u0441\u044f, \u043c\u043e\u0433\u0443\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u043f\u043e\u0442\u0440\u043e\u0433\u0430\u0442\u044c \u0432\u0441\u0451 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438. \u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0439 \u0412\u043b\u0430\u0441\u0442\u0432\u0443\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27802,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37084","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/c-i-cmake-bratya-navek-chast-ii\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47C++ \u0438 CMake \u2014 \u0431\u0440\u0430\u0442\u044c\u044f \u043d\u0430\u0432\u0435\u043a, \u0447\u0430\u0441\u0442\u044c II | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/c-i-cmake-bratya-navek-chast-ii\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:15:40+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:15:40+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47C++ et CMake \u2014 fr\u00e8res pour toujours, partie II | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/c-i-cmake-bratya-navek-chast-ii","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47C++ \u0438 CMake \u2014 \u0431\u0440\u0430\u0442\u044c\u044f \u043d\u0430\u0432\u0435\u043a, \u0447\u0430\u0441\u0442\u044c II | ProHoster","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/c-i-cmake-bratya-navek-chast-ii","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:15:40+00:00","article:modified_time":"2019-10-31T19:15:40+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37084","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 06:02:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:33:25","updated":"2026-01-22 06:02:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/37084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=37084"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/37084\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/27802"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=37084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=37084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=37084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}