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

         ~  see 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 <mylib/myfeature.hpp>
+
+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 ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ‚Ρ€ΡƒΠ΄Π½ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈ само Π·Π° ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‰Π°Π½Π΅ Π½Π° някои свойства, зависимости ΠΈ Ρ‚.Π½. Π’ ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с тях сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° ΠΏΠΎ ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½.

Π’ΠΎΠ²Π° Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€