C++ ๋ฐ CMake - ์˜์›ํ•œ ํ˜•์ œ, XNUMX๋ถ€

C++ ๋ฐ CMake - ์˜์›ํ•œ ํ˜•์ œ, XNUMX๋ถ€

์•ž ๋ถ€๋ถ„์—์„œ ์ด ์žฌ๋ฏธ์žˆ๋Š” ์ด์•ผ๊ธฐ๋Š” 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 ๋Œ€์ƒ์€ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ๊ทธ๋“ค์€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋Š ๊ฒƒ์ด ๋‹น์‹ ์ด ์–ป์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€