建立一个新的C ++项目通常需要大量的准备和样板代码,对于具有测试,可执行文件和连续集成的现代C ++项目而言,更是如此。该模板是从许多以前的项目中学习的结果,应有助于减少设置现代C ++项目所需的工作。
Greeter是指项目的名称,而greeter则以文件名使用。include/greeter目录以使用项目的小写名称,并相应地更新所有相关的#include s。CODECOV_TOKEN下的项目的github秘密最终,您可以删除任何未使用的文件,例如独立目录或无关的github工作流程。随时用适合您项目的许可替换许可证。
为了清洁库和子标记代码,外部CMakeList.txt仅定义库本身,而测试和其他子标记则在自己的目录中是独立的。在开发过程中,通常可以立即构建所有子项目。
使用以下命令构建并运行可执行的目标。
cmake -S standalone -B build/standalone
cmake --build build/standalone
./build/standalone/Greeter --help使用项目根目录中的以下命令来运行测试套件。
cmake -S test -B build/test
cmake --build build/test
CTEST_OUTPUT_ON_FAILURE=1 cmake --build build/test --target test
# or simply call the executable:
./build/test/GreeterTests要收集代码覆盖信息,请使用-DENABLE_TEST_COVERAGE=1选项运行cmake。
使用项目根目录中的以下命令来检查并修复C ++和CMAKE源样式。这就需要在当前系统上安装clang-Format , cmake-Format和Pyyaml 。
cmake -S test -B build/test
# view changes
cmake --build build/test --target format
# apply changes
cmake --build build/test --target fix-format有关详细信息,请参见格式。这些依赖项可以使用PIP轻松安装。
pip install clang-format==14.0.6 cmake_format==0.6.11 pyyaml每当创建GITHUB发布时,文档将自动构建和发布。要手动构建文档,请致电以下命令。
cmake -S documentation -B build/doc
cmake --build build/doc --target GenerateDocs
# view the docs
open build/doc/doxygen/html/index.html要在本地构建文档,您将需要在系统上安装Doxygen,Jinja2和Pygments。
该项目还包括一个允许同时构建所有目标的all目录。这在开发过程中很有用,因为它可以将所有子项目暴露于您的IDE,并避免库的冗余构建。
cmake -S all -B build
cmake --build build
# run tests
./build/test/GreeterTests
# format code
cmake --build build --target fix-format
# run standalone
./build/standalone/Greeter --help
# build docs
cmake --build build --target GenerateDocs测试和独立子标记包括工具。CMAKE文件,用于通过CMake配置参数导入点播其他工具。目前支持以下内容。
可以通过使用-DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'>来启用消毒器。 -DUSE_SANITIZER=<Address | Memory | MemoryWithOrigins | Undefined | Thread | Leak | 'Address;Undefined'> 。
可以通过设置-DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck>可以启用静态分析仪。 -DUSE_STATIC_ANALYZER=<clang-tidy | iwyu | cppcheck> ,或者在引号中的组合,被分子隔开。默认情况下,分析仪将自动找到配置文件,例如.clang-format 。可以通过设置CLANG_TIDY_ARGS , IWYU_ARGS或CPPCHECK_ARGS变量来传递其他参数。
可以通过配置-DUSE_CCACHE=<ON | OFF>可以启用CCACHE -DUSE_CCACHE=<ON | OFF> 。
我可以将其用于仅限标题库吗?
是的,但是您需要将库类型更改为cmakelists.txt中记录的INTERFACE库。请参阅此处,以获取基于模板的示例仅限标头库。
我不需要独立的目标 /文档。我怎么能摆脱它?
只需删除独立 /文档目录,并根据GitHub工作流文件即可。
我可以同时构建独立的测试吗? /我如何告诉我的IDE所有子标题?
为了保持模板模块化,从库中派生的所有子标记都已分离为自己的CMAKE模块。这种方法使第三方项目重复使用项目库代码变得很微不足道。为了允许IDE查看项目的完整范围,该模板包含将为所有子项目创建一个单个构建的all目录。将其用作最佳IDE支持的主要目录。
我看到您正在使用
GLOB在cmakelists.txt中添加源文件。那不是邪恶吗?
Glob被认为是不好的,因为对源文件结构的任何更改可能不会被CMAKE的构建器自动捕获,因此您需要手动调用CMAKE更改。我个人更喜欢GLOB解决方案的简单性,但可以随意将其更改为明确列出来源。
我想创建取决于我的库的其他目标。我应该修改主要的Cmakelists以包括在内吗?
避免在库中包括cmakelists的派生项目(即使这在C ++世界中是一个常见的景象),因为这有效地颠倒了依赖树,并使构建系统难以推断。相反,使用cmakelists创建一个新的目录或项目,将库添加为依赖项(例如,就像独立目录一样)。根据类型,将这些组件移至单独的存储库中可能是有道理的,并引用了库的特定提交或版本。这具有一个优势,即可以独立改进和更新各个库和组件。
您建议使用cpm.cmake添加外部依赖关系。这个图书馆的用户也会使用cpm.cmake吗?
cpm.cmake应该对图书馆用户看不见,因为它是一个独立的cmake脚本。如果出现问题,用户总是可以通过定义CMAKE或ENV变量CPM_USE_LOCAL_PACKAGES选择退出,该cpm_use_local_package将使用find_package调用来覆盖所有呼叫CPMAddPackage 。这还应该使用户能够将项目与他们喜欢的外部C ++依赖管理器(例如VCPKG或CONAN)一起使用。
我可以离线配置和构建项目吗?
构建项目不需要Internet连接,但是在使用CPM时,将在配置时下载丢失的依赖项。为了避免多余的下载,强烈建议设置CPM。CMAKECACHERETORY,例如: export CPM_SOURCE_CACHE=$HOME/.cache/CPM 。这将启用浅层克隆,并允许在缓存中提供离线配置依赖关系。
我可以使用CPACK为项目创建软件包安装程序吗?
由于有很多可能的选项和配置,因此在此模板的范围中尚未(尚未)。有关设置CPACK安装程序的更多信息,请参见CPACK文档。
这太多了,我只想使用C ++代码并测试一些库。
也许微型彭斯特特适合您!