
ในระหว่างการพัฒนา ฉันชอบเปลี่ยนคอมไพเลอร์ โหมดการสร้าง เวอร์ชันการพึ่งพา ทำการวิเคราะห์แบบคงที่ วัดประสิทธิภาพ รวบรวมความครอบคลุม สร้างเอกสาร ฯลฯ และฉันชอบ CMake มากเพราะมันทำให้ฉันทำทุกอย่างที่ฉันต้องการได้
หลายคนวิพากษ์วิจารณ์ CMake และมักจะสมควรเป็นเช่นนั้น แต่ถ้าคุณลองมองดู ไม่ใช่ว่าทุกอย่างจะแย่ขนาดนั้น และเมื่อเร็ว ๆ นี้ ไม่เลวเลยและทิศทางการพัฒนาค่อนข้างเป็นบวก
ในบันทึกนี้ ฉันอยากจะบอกคุณถึงวิธีการจัดระเบียบไลบรารีส่วนหัวใน C++ ในระบบ CMake เพื่อรับฟังก์ชันการทำงานต่อไปนี้:
- การประกอบ;
- การทดสอบการทำงานอัตโนมัติ
- การวัดความครอบคลุมของโค้ด
- การติดตั้ง;
- จัดทำเอกสารอัตโนมัติ
- การสร้างแซนด์บ็อกซ์ออนไลน์
- การวิเคราะห์แบบคงที่
ใครก็ตามที่เข้าใจถึงข้อดีและ C-make อยู่แล้วก็สามารถทำได้ง่ายๆ และเริ่มใช้มัน
Содержание
.
├── CMakeLists.txt
├── README.en.md
├── README.md
├── doc
│ ├── CMakeLists.txt
│ └── Doxyfile.in
├── include
│ └── mylib
│ └── myfeature.hpp
├── online
│ ├── CMakeLists.txt
│ ├── mylib-example.cpp
│ └── wandbox.py
└── test
├── CMakeLists.txt
├── mylib
│ └── myfeature.cpp
└── test_main.cppเราจะพูดถึงวิธีจัดระเบียบสคริปต์ CMake เป็นหลัก ดังนั้นพวกเขาจะพูดคุยกันโดยละเอียด ทุกคนสามารถดูไฟล์ที่เหลือได้โดยตรง .
ก่อนอื่น คุณต้องขอระบบ CMake เวอร์ชันที่ต้องการ CMake กำลังพัฒนา ลายเซ็นคำสั่งและลักษณะการทำงานในสภาวะที่แตกต่างกันกำลังเปลี่ยนแปลง เพื่อให้ CMake เข้าใจสิ่งที่เราต้องการได้ทันที เราต้องบันทึกข้อกำหนดของเราทันที
cmake_minimum_required(VERSION 3.13)จากนั้นเราจะกำหนดโปรเจ็กต์ของเรา ชื่อ เวอร์ชัน ภาษาที่ใช้ ฯลฯ (ดู ).
ในกรณีนี้เราระบุภาษา CXX (และนี่หมายถึง C++) เพื่อให้ CMake ไม่เครียดและค้นหาคอมไพเลอร์ภาษา C (โดยค่าเริ่มต้น CMake จะมีสองภาษา: C และ C++)
project(Mylib VERSION 1.0 LANGUAGES CXX)ที่นี่คุณสามารถตรวจสอบได้ทันทีว่าโครงการของเรารวมอยู่ในโครงการอื่นเป็นโครงการย่อยหรือไม่ สิ่งนี้จะช่วยได้มากในอนาคต
get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)
เราจะให้สองทางเลือก
ตัวเลือกแรกคือ — เพื่อปิดการทดสอบหน่วย นี่อาจจำเป็นหากเราแน่ใจว่าทุกอย่างเป็นไปตามการทดสอบ แต่เราต้องการเพียงติดตั้งหรือจัดทำแพ็กเกจโครงการของเรา เป็นต้น หรือโครงการของเราถูกรวมเป็นโครงการย่อย - ในกรณีนี้ ผู้ใช้โครงการของเราไม่สนใจที่จะดำเนินการทดสอบของเรา คุณไม่ได้ทดสอบการพึ่งพาที่คุณใช้ใช่ไหม?
option(MYLIB_TESTING "Включить модульное тестирование" ON)นอกจากนี้เราจะสร้างตัวเลือกแยกต่างหาก สำหรับการวัดความครอบคลุมของโค้ดด้วยการทดสอบ แต่จะต้องใช้เครื่องมือเพิ่มเติม จึงต้องเปิดใช้งานอย่างชัดเจน
option(MYLIB_COVERAGE "Включить измерение покрытия кода тестами" OFF)
แน่นอนว่าเราเป็นโปรแกรมเมอร์ที่ยอดเยี่ยม ดังนั้นเราจึงต้องการระดับสูงสุดของการวินิจฉัยเวลาคอมไพล์จากคอมไพเลอร์ ไม่มีหนูสักตัวเดียวที่จะผ่านไปได้
add_compile_options(
-Werror
-Wall
-Wextra
-Wpedantic
-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promo
)นอกจากนี้เรายังจะปิดการใช้งานส่วนขยายเพื่อให้สอดคล้องกับมาตรฐานภาษา C++ โดยสมบูรณ์ เปิดใช้งานตามค่าเริ่มต้นใน CMake
if(NOT CMAKE_CXX_EXTENSIONS)
set(CMAKE_CXX_EXTENSIONS OFF)
endif()
ไลบรารีของเราประกอบด้วยไฟล์ส่วนหัวเท่านั้น ซึ่งหมายความว่าเราไม่มีไฟล์ใด ๆ เหลืออยู่ในรูปแบบของไลบรารีแบบคงที่หรือไดนามิก ในทางกลับกัน ในการใช้ไลบรารีของเราภายนอก จำเป็นต้องติดตั้ง จะต้องตรวจพบได้ในระบบและเชื่อมต่อกับโปรเจ็กต์ของคุณ และในขณะเดียวกัน ส่วนหัวเดียวกันเหล่านี้ รวมถึงส่วนหัวเพิ่มเติมบางส่วนด้วย แนบไปกับคุณสมบัตินั้น
เพื่อจุดประสงค์นี้ เราจึงสร้างไลบรารีอินเทอร์เฟซขึ้นมา
add_library(mylib INTERFACE)เราผูกส่วนหัวเข้ากับไลบรารีอินเทอร์เฟซของเรา
การใช้ CMake ที่ทันสมัย ทันสมัย สำหรับคนรุ่นใหม่หมายถึงส่วนหัว คุณสมบัติ ฯลฯ ถ่ายทอดผ่านเป้าหมายเดียว เลยพอจะพูดได้. และส่วนหัวทั้งหมดที่เกี่ยวข้องกับเป้าหมาย dependencyจะพร้อมใช้งานสำหรับแหล่งที่มาที่เป็นของเป้าหมาย target. และคุณไม่จำเป็นต้องมีเลย [target_]include_directories. สิ่งนี้จะถูกแสดงให้เห็นด้านล่างในการวิเคราะห์ .
นอกจากนี้ยังควรให้ความสนใจกับสิ่งที่เรียกว่า .
คำสั่งนี้จะเชื่อมโยงส่วนหัวที่เราต้องการกับไลบรารีอินเทอร์เฟซของเรา และหากไลบรารีของเราเชื่อมต่อกับเป้าหมายใดๆ ภายในลำดับชั้น CMake เดียวกัน ส่วนหัวจากไดเร็กทอรีก็จะเชื่อมโยงด้วย ${CMAKE_CURRENT_SOURCE_DIR}/includeและหากไลบรารีของเราได้รับการติดตั้งบนระบบและเชื่อมต่อกับโปรเจ็กต์อื่นโดยใช้คำสั่ง จากนั้นส่วนหัวจากไดเร็กทอรีจะเชื่อมโยงด้วย include สัมพันธ์กับไดเร็กทอรีการติดตั้ง
target_include_directories(mylib INTERFACE
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)มากำหนดมาตรฐานภาษากันเถอะ แน่นอนว่าอันสุดท้าย ในเวลาเดียวกัน เราไม่เพียงแต่รวมมาตรฐานเท่านั้น แต่ยังขยายไปยังผู้ที่จะใช้ห้องสมุดของเราด้วย สิ่งนี้เกิดขึ้นได้เนื่องจากคุณสมบัติที่กำหนดไว้มีหมวดหมู่ INTERFACE (โปรดดู ).
target_compile_features(mylib INTERFACE cxx_std_17)มาสร้างนามแฝงสำหรับห้องสมุดของเรากันดีกว่า นอกจากนี้เพื่อความสวยงามก็จะอยู่ใน "เนมสเปซ" พิเศษ สิ่งนี้จะมีประโยชน์เมื่อมีโมดูลต่างๆ ปรากฏในไลบรารีของเรา และเราจะเชื่อมต่อโมดูลเหล่านั้นแยกจากกัน .
add_library(Mylib::mylib ALIAS mylib)
การติดตั้งส่วนหัวของเราเข้าสู่ระบบ ทุกอย่างเรียบง่ายที่นี่ เราบอกว่าโฟลเดอร์ที่มีส่วนหัวทั้งหมดควรเข้าไปในไดเร็กทอรี include สัมพันธ์กับสถานที่ติดตั้ง
install(DIRECTORY include/mylib DESTINATION include)ต่อไป เราจะแจ้งระบบบิลด์ว่าเราต้องการให้เรียกใช้คำสั่งในโปรเจ็กต์บุคคลที่สามได้ find_package(Mylib) และบรรลุเป้าหมาย Mylib::mylib.
install(TARGETS mylib EXPORT MylibConfig)
install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake)คาถาถัดไปควรเข้าใจด้วยวิธีนี้ เมื่ออยู่ในโปรเจ็กต์บุคคลที่สาม เราเรียกคำสั่ง find_package(Mylib 1.2.3 REQUIRED)และเวอร์ชันจริงของไลบรารีที่ติดตั้งไว้จะเข้ากันไม่ได้กับเวอร์ชันนั้น 1.2.3CMake จะสร้างข้อผิดพลาดโดยอัตโนมัติ นั่นคือคุณไม่จำเป็นต้องติดตามเวอร์ชันด้วยตนเอง
include(CMakePackageConfigHelpers)
write_basic_package_version_file("${PROJECT_BINARY_DIR}/MylibConfigVersion.cmake"
VERSION
${PROJECT_VERSION}
COMPATIBILITY
AnyNewerVersion
)
install(FILES "${PROJECT_BINARY_DIR}/MylibConfigVersion.cmake" DESTINATION share/Mylib/cmake)
หากการทดสอบถูกปิดใช้งานอย่างชัดเจนโดยใช้ หรือโปรเจ็กต์ของเราเป็นโปรเจ็กต์ย่อย กล่าวคือ เชื่อมต่อกับโปรเจ็กต์ CMake อื่นโดยใช้คำสั่ง เราจะไม่ย้ายไปตามลำดับชั้นอีกต่อไป และสคริปต์ซึ่งอธิบายคำสั่งสำหรับการสร้างและรันการทดสอบก็ไม่ทำงาน
if(NOT MYLIB_TESTING)
message(STATUS "Тестирование проекта Mylib выключено")
elseif(IS_SUBPROJECT)
message(STATUS "Mylib не тестируется в режиме подмодуля")
else()
add_subdirectory(test)
endif()
เอกสารจะไม่ถูกสร้างขึ้นในกรณีของโครงการย่อย
if(NOT IS_SUBPROJECT)
add_subdirectory(doc)
endif()
ในทำนองเดียวกัน โครงการย่อยจะไม่มีแซนด์บ็อกซ์ออนไลน์เช่นกัน
if(NOT IS_SUBPROJECT)
add_subdirectory(online)
endif()
ก่อนอื่น เราพบแพ็คเกจที่มีกรอบการทดสอบที่จำเป็น (แทนที่ด้วยเฟรมเวิร์กที่คุณชื่นชอบ)
find_package(doctest 2.3.3 REQUIRED)มาสร้างไฟล์ปฏิบัติการของเราพร้อมการทดสอบกันดีกว่า โดยปกติแล้วฉันจะเพิ่มเฉพาะไฟล์ที่จะมีฟังก์ชันลงในไบนารี่ที่ปฏิบัติการได้โดยตรง main.
add_executable(mylib-unit-tests test_main.cpp)และฉันเพิ่มไฟล์ที่อธิบายการทดสอบในภายหลัง แต่คุณไม่จำเป็นต้องทำอย่างนั้น
target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp)เราเชื่อมโยงการพึ่งพา โปรดทราบว่าเราเชื่อมโยงเฉพาะเป้าหมาย CMake ที่เราต้องการกับไบนารีของเราและไม่ได้เรียกใช้คำสั่ง target_include_directories. หัวข้อจากกรอบการทดสอบและจากของเรา Mylib::mylibเช่นเดียวกับพารามิเตอร์บิลด์ (ในกรณีของเรา นี่คือมาตรฐานภาษา C++) ผ่านมาพร้อมกับเป้าหมายเหล่านี้
target_link_libraries(mylib-unit-tests
PRIVATE
Mylib::mylib
doctest::doctest
)สุดท้ายนี้ เราสร้างเป้าหมายจำลอง "บิลด์" ซึ่งเทียบเท่ากับการทดสอบที่กำลังรันอยู่ และเพิ่มเป้าหมายนี้ให้กับบิลด์เริ่มต้น (แอตทริบิวต์จะรับผิดชอบในสิ่งนี้ ALL). ซึ่งหมายความว่าบิลด์เริ่มต้นจะทริกเกอร์การทดสอบให้ทำงาน ซึ่งหมายความว่าเราจะไม่มีวันลืมเรียกใช้การทดสอบ
add_custom_target(check ALL COMMAND mylib-unit-tests)
ต่อไป เราจะเปิดใช้งานการวัดการครอบคลุมโค้ดหากมีการระบุตัวเลือกที่เหมาะสม ฉันจะไม่ลงรายละเอียด เพราะมันเกี่ยวข้องกับเครื่องมือในการวัดความครอบคลุมมากกว่า CMake สิ่งสำคัญคือต้องทราบว่าเป้าหมายจะถูกสร้างขึ้นตามผลลัพธ์ ซึ่งสะดวกในการเริ่มการวัดความครอบคลุม
find_program(GCOVR_EXECUTABLE gcovr)
if(MYLIB_COVERAGE AND GCOVR_EXECUTABLE)
message(STATUS "Измерение покрытия кода тестами включено")
target_compile_options(mylib-unit-tests PRIVATE --coverage)
target_link_libraries(mylib-unit-tests PRIVATE gcov)
add_custom_target(coverage
COMMAND
${GCOVR_EXECUTABLE}
--root=${PROJECT_SOURCE_DIR}/include/
--object-directory=${CMAKE_CURRENT_BINARY_DIR}
DEPENDS
check
)
elseif(MYLIB_COVERAGE AND NOT GCOVR_EXECUTABLE)
set(MYLIB_COVERAGE OFF)
message(WARNING "Для замеров покрытия кода тестами требуется программа gcovr")
endif()
.
find_package(Doxygen)ต่อไปเราจะตรวจสอบว่าผู้ใช้ได้ตั้งค่าตัวแปรภาษาหรือไม่ ถ้าใช่เราก็อย่าแตะมันถ้าไม่ใช่เราก็เอาภาษารัสเซีย จากนั้นเรากำหนดค่าไฟล์ระบบ Doxygen ตัวแปรที่จำเป็นทั้งหมด รวมถึงภาษา จะไปที่นั่นในระหว่างกระบวนการกำหนดค่า (ดู ).
จากนั้นเราก็สร้างเป้าหมาย ซึ่งจะเริ่มสร้างเอกสาร เนื่องจากการสร้างเอกสารไม่ใช่ความต้องการที่ใหญ่ที่สุดในกระบวนการพัฒนา เป้าหมายจะไม่ถูกเปิดใช้งานตามค่าเริ่มต้น แต่จะต้องเปิดใช้งานอย่างชัดเจน
if (Doxygen_FOUND)
if (NOT MYLIB_DOXYGEN_LANGUAGE)
set(MYLIB_DOXYGEN_LANGUAGE Russian)
endif()
message(STATUS "Doxygen documentation will be generated in ${MYLIB_DOXYGEN_LANGUAGE}")
configure_file(Doxyfile.in Doxyfile)
add_custom_target(doc COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
endif ()
ที่นี่เราพบ Python ตัวที่สามและสร้างเป้าหมาย ซึ่งสร้างคำขอที่สอดคล้องกับบริการ API และส่งเขาออกไป การตอบกลับมาพร้อมกับลิงก์ไปยังแซนด์บ็อกซ์ที่เสร็จแล้ว
find_program(PYTHON3_EXECUTABLE python3)
if(PYTHON3_EXECUTABLE)
set(WANDBOX_URL "https://wandbox.org/api/compile.json")
add_custom_target(wandbox
COMMAND
${PYTHON3_EXECUTABLE} wandbox.py mylib-example.cpp "${PROJECT_SOURCE_DIR}" include |
curl -H "Content-type: application/json" -d @- ${WANDBOX_URL}
WORKING_DIRECTORY
${CMAKE_CURRENT_SOURCE_DIR}
DEPENDS
mylib-unit-tests
)
else()
message(WARNING "Для создания онлайн-песочницы требуется интерпретатор ЯП python 3-й версии")
endif()
ตอนนี้เรามาดูวิธีใช้ทั้งหมดนี้กันดีกว่า
การสร้างโปรเจ็กต์นี้ เช่นเดียวกับโปรเจ็กต์อื่นๆ บนระบบการสร้าง CMake ประกอบด้วยสองขั้นตอน:
cmake -S путь/к/исходникам -B путь/к/сборочной/директории [опции ...]หากคำสั่งข้างต้นใช้งานไม่ได้เนื่องจาก CMake เวอร์ชันเก่า ให้ลองละเว้น
-S:cmake путь/к/исходникам -B путь/к/сборочной/директории [опции ...]
.
cmake --build путь/к/сборочной/директории [--target target].
cmake -S ... -B ... -DMYLIB_COVERAGE=ON [прочие опции ...]รวมถึงเป้าหมาย ซึ่งคุณสามารถเริ่มวัดการครอบคลุมโค้ดด้วยการทดสอบได้
cmake -S ... -B ... -DMYLIB_TESTING=OFF [прочие опции ...]ให้ความสามารถในการปิดใช้งานการสร้างการทดสอบหน่วยและเป้าหมาย . ด้วยเหตุนี้ การวัดความครอบคลุมโค้ดโดยการทดสอบจึงถูกปิด (ดู ).
การทดสอบจะถูกปิดใช้งานโดยอัตโนมัติหากโปรเจ็กต์เชื่อมต่อกับโปรเจ็กต์อื่นเป็นโปรเจ็กต์ย่อยโดยใช้คำสั่ง .
cmake -S ... -B ... -DMYLIB_DOXYGEN_LANGUAGE=English [прочие опции ...]สลับภาษาของเอกสารที่เป้าหมายสร้างขึ้น ถึงผู้ที่ได้รับ สำหรับรายการภาษาที่ใช้ได้ โปรดดู .
รัสเซียเปิดใช้งานตามค่าเริ่มต้น
cmake --build path/to/build/directory
cmake --build path/to/build/directory --target allหากไม่ได้ระบุเป้าหมาย (ซึ่งเทียบเท่ากับเป้าหมาย all) รวบรวมทุกสิ่งที่สามารถทำได้และเรียกเป้าหมายด้วย .
cmake --build path/to/build/directory --target mylib-unit-testsรวบรวมการทดสอบหน่วย เปิดใช้งานตามค่าเริ่มต้น
cmake --build путь/к/сборочной/директории --target checkรันการทดสอบหน่วยที่รวบรวมไว้ (หากยังไม่ได้รวบรวม) เปิดใช้งานตามค่าเริ่มต้น
ดูเพิ่มเติม .
cmake --build путь/к/сборочной/директории --target coverageวิเคราะห์การทดสอบหน่วยที่ทำงานอยู่ (หากยังไม่ได้รัน) สำหรับการครอบคลุมโค้ดโดยการทดสอบโดยใช้โปรแกรม .
การเคลือบท่อไอเสียจะมีลักษณะดังนี้:
------------------------------------------------------------------------------
GCC Code Coverage Report
Directory: /path/to/cmakecpptemplate/include/
------------------------------------------------------------------------------
File Lines Exec Cover Missing
------------------------------------------------------------------------------
mylib/myfeature.hpp 2 2 100%
------------------------------------------------------------------------------
TOTAL 2 2 100%
------------------------------------------------------------------------------เป้าหมายจะพร้อมใช้งานเมื่อเปิดใช้งานตัวเลือกเท่านั้น .
ดูเพิ่มเติม .
cmake --build путь/к/сборочной/директории --target docเริ่มต้นการสร้างเอกสารโค้ดโดยใช้ระบบ .
cmake --build путь/к/сборочной/директории --target wandboxการตอบสนองจากบริการมีลักษณะดังนี้:
{
"permlink" : "QElvxuMzHgL9fqci",
"status" : "0",
"url" : "https://wandbox.org/permlink/QElvxuMzHgL9fqci"
}ใช้บริการนี้ . ฉันไม่รู้ว่าเซิร์ฟเวอร์ของพวกเขามีความยืดหยุ่นแค่ไหน แต่ฉันคิดว่าโอกาสนี้ไม่ควรถูกใช้ในทางที่ผิด
สร้างโปรเจ็กต์ในโหมดแก้ไขข้อบกพร่องด้วยการวัดความครอบคลุม
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug -DMYLIB_COVERAGE=ON
cmake --build путь/к/сборочной/директории --target coverage --parallel 16การติดตั้งโปรเจ็กต์โดยไม่ต้องประกอบและทดสอบเบื้องต้น
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DMYLIB_TESTING=OFF -DCMAKE_INSTALL_PREFIX=путь/к/установойной/директории
cmake --build путь/к/сборочной/директории --target installสร้างในโหมด release ด้วยคอมไพเลอร์ที่กำหนด
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_PREFIX_PATH=путь/к/директории/куда/установлены/зависимости
cmake --build путь/к/сборочной/директории --parallel 4จัดทำเอกสารเป็นภาษาอังกฤษ
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Release -DMYLIB_DOXYGEN_LANGUAGE=English
cmake --build путь/к/сборочной/директории --target doc
3.13
อันที่จริง CMake เวอร์ชัน 3.13 จำเป็นสำหรับการรันคำสั่งคอนโซลบางคำสั่งที่อธิบายไว้ในวิธีใช้นี้เท่านั้น จากมุมมองของไวยากรณ์ของสคริปต์ CMake เวอร์ชัน 3.8 ก็เพียงพอแล้วหากเรียกใช้การสร้างด้วยวิธีอื่น
ห้องสมุดทดสอบ
การทดสอบสามารถปิดใช้งานได้ (ดู ).
หากต้องการเปลี่ยนภาษาที่จะสร้างเอกสารประกอบ จะมีการจัดเตรียมตัวเลือกไว้ .
ล่ามภาษา
สำหรับการสร้างอัตโนมัติ .
ด้วย CMake และเครื่องมือดีๆ สองสามอย่าง คุณสามารถวิเคราะห์แบบคงที่ได้โดยใช้ความพยายามเพียงเล็กน้อย
ซีพีเช็ค
CMake มีการสนับสนุนในตัวสำหรับเครื่องมือวิเคราะห์แบบคงที่ .
ในการทำเช่นนี้คุณต้องใช้ตัวเลือกนี้ :
cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;-Iпуть/к/исходникам/include"หลังจากนี้ การวิเคราะห์แบบสแตติกจะถูกเปิดใช้งานโดยอัตโนมัติทุกครั้งที่คอมไพล์และคอมไพล์ซอร์สใหม่ ไม่จำเป็นต้องทำอะไรเพิ่มเติม
เสียงดังกราว
ด้วยความช่วยเหลือของเครื่องมือที่ยอดเยี่ยม คุณยังสามารถเรียกใช้การวิเคราะห์แบบคงที่ได้ในเวลาไม่นาน:
scan-build cmake -S путь/к/исходникам -B путь/к/сборочной/директории -DCMAKE_BUILD_TYPE=Debug
scan-build cmake --build путь/к/сборочной/директорииที่นี่ ไม่เหมือนกับกรณีของ Cppcheck คุณจะต้องรันบิลด์ทุกครั้ง scan-build.
CMake เป็นระบบที่ทรงพลังและยืดหยุ่นมากซึ่งช่วยให้คุณใช้ฟังก์ชันการทำงานสำหรับทุกรสนิยมและทุกสี และแม้ว่าบางครั้งไวยากรณ์จะออกมาเป็นที่ต้องการมาก แต่มารก็ยังไม่น่ากลัวเท่ากับที่เขาวาด ใช้ระบบสร้าง CMake เพื่อประโยชน์ของสังคมและสุขภาพ
→
ที่มา: will.com
