C++ ΠΈ CMake β€” Π·Π°Π²ΠΈΠ½Π°Π³ΠΈ братя, част II

C++ ΠΈ CMake β€” Π·Π°Π²ΠΈΠ½Π°Π³ΠΈ братя, част II

Π’ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° част Π² Ρ‚ΠΎΠ·ΠΈ ΡƒΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»Π΅Π½ Ρ€Π°Π·ΠΊΠ°Π· сС Π³ΠΎΠ²ΠΎΡ€Π΅ΡˆΠ΅ Π·Π° организацията Π½Π° Π·Π°Π³Π»Π°Π²Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π½Π° систСми Π·Π° компилация CMake.

Π’ΠΎΠ·ΠΈ ΠΏΡŠΡ‚ Ρ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ Ρ‰Π΅ обсъдим ΠΊΠ°ΠΊ Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌ.

ΠšΠ°ΠΊΡ‚ΠΎ Π²ΠΈΠ½Π°Π³ΠΈ, Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Ρ‡Π°ΠΊΠ°Ρ‚, ΠΌΠΎΠ³Π°Ρ‚ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° сС насочат към обновСния Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΡƒΠΌ ΠΈ Π΄Π° ΠΎΠΏΠΈΡ‚Π°Ρ‚ всичко сами.


Π‘ΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅

  1. РаздСляй
  2. Π¦Π°Ρ€ΡƒΠ²Π°ΠΉ

РаздСляй

ΠŸΡŠΡ€Π²ΠΎΡ‚ΠΎ Π½Π΅Ρ‰ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ, Π·Π° Π΄Π° постигнСм Π½Π°ΡˆΠ°Ρ‚Π° висока Ρ†Π΅Π», Π΅ Π΄Π° Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½ΠΎΡ‚ΠΎ софтуСрно ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° унивСрсални ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ са ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° потрСбитСля.

Π’ ΠΏΡŠΡ€Π²Π°Ρ‚Π° част бСшС описан Ρ‚Π°ΠΊΡŠΠ² стандартСн Π±Π»ΠΎΠΊ β€” ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ със Π·Π°Π³Π»Π°Π²Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Π‘Π΅Π³Π° Ρ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ към нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°.

Π—Π° Ρ†Π΅Π»Ρ‚Π° Ρ‰Π΅ изнСсСм рСализацията Π½Π° функцията myfunc Π² ΠΎΡ‚Π΄Π΅Π»Π΅Π½ .cpp-Ρ„Π°ΠΉΠ»:

diff --git a/include/mylib/myfeature.hpp b/include/mylib/myfeature.hpp
index 43db388..ba62b4f 100644
--- a/include/mylib/myfeature.hpp
+++ b/include/mylib/myfeature.hpp
@@ -46,8 +46,5 @@ namespace mylib

         ~  Π²ΠΈΠΆ mystruct
      * /
-    inline bool myfunc (mystruct)
-    {
-        return true;
-    }
+    bool myfunc (mystruct);
 }
diff --git a/src/mylib/myfeature.cpp b/src/mylib/myfeature.cpp
new file mode 100644
index 0000000..abb5004
--- /dev/null
+++ b/src/mylib/myfeature.cpp
@@ -0,0 +1,9 @@
+#include 
+
+namespace mylib
+{
+    bool myfunc (mystruct)
+    {
+        return true;
+    }
+}

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° (myfeature), която Ρ‰Π΅ сС ΡΡŠΡΡ‚ΠΎΠΈ ΠΎΡ‚ получСния Π½Π° ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° .cpp-Ρ„Π°ΠΉΠ». Новата Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ изисква Π²Π΅Ρ‡Π΅ Π½Π°Π»ΠΈΡ‡Π½ΠΈ заглавия ΠΈ Π·Π° Π΄Π° осигурим Ρ‚ΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ΠΌ ΠΈ трябва Π΄Π° я ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ с Π½Π°Π»ΠΈΡ‡Π½Π°Ρ‚Π° Ρ†Π΅Π» mylib. Π‘Π²ΡŠΡ€Π·Π²Π°Π½Π΅Ρ‚ΠΎ ΠΌΠ΅ΠΆΠ΄Ρƒ тях Π΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ бъдС ΡΠ²ΡŠΡ€Π·Π°Π½ΠΎ с Ρ†Π΅Π»Ρ‚Π° myfeature, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠΈ Ρ†Π΅Π»Ρ‚Π° mylib (ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Π½Π°Ρ‡ΠΈΠ½ΠΈΡ‚Π΅ Π½Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅).

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 108045c..0de77b8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -64,6 +64,17 @@ target_compile_features(mylib INTERFACE cxx_std_17)

 add_library(Mylib::mylib ALIAS mylib)

+###################################################################################################
+##
+##      ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°
+##
+###################################################################################################
+
+add_library(myfeature src/mylib/myfeature.cpp)
+target_link_libraries(myfeature PUBLIC mylib)
+
+add_library(Mylib::myfeature ALIAS myfeature)
+

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π½ΠΎΠ²Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΄Π° бъдС инсталирана Π² систСмата:

@@ -72,7 +83,7 @@ add_library(Mylib::mylib ALIAS mylib)

 install(DIRECTORY include/mylib DESTINATION include)

-install(TARGETS mylib EXPORT MylibConfig)
+install(TARGETS mylib myfeature EXPORT MylibConfig)
 install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake)

 include(CMakePackageConfigHelpers)

Врябва Π΄Π° сС ΠΎΠ±ΡŠΡ€Π½Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Π΅ Π·Π° Ρ†Π΅Π»Ρ‚Π° myfeature, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π·Π° mylib Π΅ създадСн псСвдоним с прСфикс Mylib::. Π‘ΡŠΡ‰ΠΎΡ‚ΠΎ Π΅ записано ΠΈ Π·Π° Π΄Π²Π΅Ρ‚Π΅ Ρ†Π΅Π»ΠΈ ΠΏΡ€ΠΈ СкспортиранС Π·Π° инсталация Π² систСмата. Π’ΠΎΠ²Π° Π΄Π°Π²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с Ρ†Π΅Π»ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ всяка схСма Π½Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° остава Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π½ΠΈΡ‚Π΅ тСстовС с Π½ΠΎΠ²Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° (функцията myfunc Π±Π΅ изнСсСна ΠΎΡ‚ заглавния Ρ„Π°ΠΉΠ», Ρ‚Π°ΠΊΠ° Ρ‡Π΅ сСга трябва Π΄Π° сС Π»ΠΈΠ½ΠΊΠΎΠ²Π°ΠΌΠ΅):

diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 5620be4..bc1266c 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -4,7 +4,7 @@ add_executable(mylib-unit-tests test_main.cpp)
 target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp)
 target_link_libraries(mylib-unit-tests
     PRIVATE
-        Mylib::mylib
+        Mylib::myfeature
         doctest::doctest
 )

Заглавията (Mylib::mylib) Π²Π΅Ρ‡Π΅ Π½Π΅ трябва Π΄Π° сС Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ, ΠΊΠ°ΠΊΡ‚ΠΎ Π²Π΅Ρ‡Π΅ Π±Π΅ спомСнато, Ρ‚Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ сС Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚ Π·Π°Π΅Π΄Π½ΠΎ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° (Mylib::myfeature).

И Ρ‰Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ няколко нюанса, Π·Π° Π΄Π° осигурим измСрвания Π½Π° ΠΏΠΎΠΊΡ€ΠΈΡ‚ΠΈΠ΅Ρ‚ΠΎ с ΠΎΠ³Π»Π΅Π΄ Π½Π° новопристигналата Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°:

@@ -15,11 +15,16 @@ if(MYLIB_COVERAGE AND GCOVR_EXECUTABLE)
     target_compile_options(mylib-unit-tests PRIVATE --coverage)
     target_link_libraries(mylib-unit-tests PRIVATE gcov)

+    target_compile_options(myfeature PRIVATE --coverage)
+    target_link_libraries(myfeature PRIVATE gcov)
+
     add_custom_target(coverage
         COMMAND
             ${GCOVR_EXECUTABLE}
-                --root=${PROJECT_SOURCE_DIR}/include/
-                --object-directory=${CMAKE_CURRENT_BINARY_DIR}
+                --root=${PROJECT_SOURCE_DIR}/
+                --filter=${PROJECT_SOURCE_DIR}/include
+                --filter=${PROJECT_SOURCE_DIR}/src
+                --object-directory=${PROJECT_BINARY_DIR}
         DEPENDS
             check
     )

МоТС Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, изпълними Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Ρ‚.Π½. Π’Π°ΠΆΠ½ΠΎ Π΅ СдинствСно ΠΊΠΎΠΈ Ρ†Π΅Π»ΠΈ са интСрфСйс Π½Π° нашия ΠΌΠΎΠ΄ΡƒΠ», Ρ‚.Π΅. ΠΈΠ·Π»ΠΈΠ·Π°Ρ‚ навън.

Π¦Π°Ρ€ΡƒΠ²Π°ΠΉ

Π‘Π΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ стандартни ΠΌΠΎΠ΄ΡƒΠ»Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° управляСм тях: Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€Π°Π½Π΅ Π² структура с всякаква слоТност, инсталирайки Π³ΠΈ Π² систСмата ΠΈΠ»ΠΈ ΡΠ²ΡŠΡ€Π·Π²Π°ΠΉΠΊΠΈ Π³ΠΈ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΠΌ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° Π΅Π΄ΠΈΠ½Π½Π° систСма Π·Π° сборка.

Π˜Π½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ Π² систСмата

Π•Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»Π° Π΅ Π΄Π° инсталирамС нашия ΠΌΠΎΠ΄ΡƒΠ» Π² систСмата.

cmake --build ΠΏΡŠΡ‚/ΠΊ/сборочната/дирСктория --target install

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Ρ‚ΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅ Π² всСки Π΄Ρ€ΡƒΠ³ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° find_package.

find_package(Mylib 1.0 REQUIRED)

Π‘Π²ΡŠΡ€Π·Π²Π°Π½Π΅ ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡƒΠ»

Π”Ρ€ΡƒΠ³ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΅ Π΄Π° ΡΠ²ΡŠΡ€ΠΆΠ΅ΠΌ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° с нашия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с Π΄Ρ€ΡƒΠ³ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎΠ΄ΠΌΠΎΠ΄ΡƒΠ» с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° add_subdirectory.

ИзползванС

ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‚Π΅ Π·Π° ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ са Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Π΅ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰. Π’ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° нашия ΠΌΠΎΠ΄ΡƒΠ», Ρ†Π΅Π»ΠΈΡ‚Π΅ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ ΠΈ Π² Π΄Π²Π°Ρ‚Π° случая. Mylib::myfeature ΠΈ Mylib::mylib, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠ°:

add_executable(some_executable some.cpp sources.cpp)
target_link_libraries(some_executable PRIVATE Mylib::myfeature)

Π’ конкрСтния Π½ΠΈ случай Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Mylib::myfeature трябва Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° libmyfeature. Ако ΠΈΠΌΠ° Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ Π·Π°Π³Π»Π°Π²Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Ρ‚ΠΎΠ³Π°Π²Π° Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Mylib::mylib.

CMake Ρ†Π΅Π»ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ…ΠΈΡ‚Ρ€ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈ само Π·Π° ΠΏΡ€ΠΎΠΊΠ°Ρ€Π²Π°Π½Π΅ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ свойства, зависимости ΠΈ Ρ‚.Π½. Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° с тях ΠΏΡ€ΠΎΡ‚ΠΈΡ‡Π° ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ Π½Π°Ρ‡ΠΈΠ½.

Π’ΠΎΠ²Π° искахмС Π΄Π° постигнСм.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster