提供一个适当的CMake配置文件来使其他人可以更容易地构建、使用和贡献你的项目。
这篇文章是使用开源DevOps工具进行C/C++开发系列文章的一部分。
如果你从一开始就把你的项目建立在一个功能强大的工具链上,你的开发会更快和更安全。
除此之外,这会使别人更容易地参与你的项目。
在这篇文章中,我将搭建一个基于CMake和VSCodium的C/C++构建系统。
像往常一样,相关的示例代码可以在GitHub上找到。
我已经测试了在本文中描述的步骤。
这是一种适用于所有平台的解决方案。
为什么用CMake?CMake是一个构建系统生成器,可以为你的项目创建Makefile。
乍一看简单的东西可能相当地复杂。
在较高的层次上,你可以定义你的项目的各个部分(可执行文件、库)、编译选项(C/C++标准、优化、架构)、依赖关系项(头文件、库),和文件级的项目结构。
CMake使用的这些信息可以在文件CMakeLists.txt中获取,它使用一种特殊的描述性语言编写。
当CMake处理这个文件时,它将自动地侦测在你的系统上已安装的编译器,并创建一个用于启动它的Makefile文件。
此外,在CMakeLists.txt中描述的配置,能够被很多编辑器读取,像QtCreator、VSCodium/VSCode或VisualStudio。
示例程序我们的示例程序是一个简单的命令行工具:它接受一个整数来作为参数,输出一个从1到所提供输入值的范围内的随机排列的数字。
$./Producer1038279151064在我们的可执行文件中的main函数,我们只处理输入的参数,如果没有提供一个值(或者一个不能被处理的值)的话,就退出程序。
intmain(intargc,char**argv){if(argc!=2){std::cerrut_of_range&){std::cerrproducer.cpp实际的工作是在生成器中完成的,它将被编译,并将作为一个静态库来链接到我们的Producer可执行文件。
std::stringstream&Generator::generate(std::stringstream&stream,constintrange){std::vectorGenerator.cpp函数generate引用一个std::stringstream和一个整数来作为一个参数。
根据整数range的值n,制作一个在1到n的范围之中的整数向量,并随后打乱。
接下来打乱的向量值转换成一个字符串,并推送到stringstream之中。
该函数返回与作为参数传递相同的stringstream引用。
顶层的CMakeLists.txt顶层的CMakeLists.txt的是我们项目的入口点。
在子目录中可能有多个CMakeLists.txt文件(例如,与项目所相关联的库或其它可执行文件)。
我们先一步一步地浏览顶层的CMakeLists.txt。
第一行告诉我们处理文件所需要的CMake的版本、项目名称及其版本,以及预定的C++标准。
cmake_minimum_required(VERSION3.14)project(CPP_Testing_SampleVERSION1.0)set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_STANDARD_REQUIREDTrue)我们用下面一行告诉CMake去查看子目录Generator。
这个子目录包括构建Generator库的所有信息,并包含它自身的一个CMakeLists.txt。
我们很快就会谈到这个问题。
add_subdirectory(Generator)现在,我们将涉及一个绝对特别的功能:CMake模块。
加载模块可以扩展CMake功能。
在我们的项目中,我们加载了FetchContent模块,这能使我们能够在CMake运行时下载外部的资源,在我们的示例中是GoogleTest。
include(FetchContent)FetchContent_Declare(googletestURL)FetchContent_MakeAvailable(googletest)在接下来的部分中,我们会做一些我们通常在普通的Makefile中会做的事:指定要构建的二进制文件、它们相关的源文件、应该链接的库,以及编译器可以找到头文件的目录。
add_executable(ProducerProducer.cpp)target_link_libraries(ProducerPUBLICGenerator)target_include_directories(ProducerPUBLIC${PROJECT_BINARY_DIR})通过下面的语句,我们使CMake来在构建文件夹中创建一个名称为compile_commands.json的文件。
这个文件会展示项目的每个文件的编译器选项。
在VSCodium中加载该文件,会告知IntelliSense功能在哪里查找头文件(查看文档)。
set(CMAKE_EXPORT_COMPILE_COMMANDSON)最后的部分为我们的项目定义一些测试。
项目使用先前加载的GoogleTest框架。
单元测试的整个话题将会划归到另外一篇文章。
enable_testingadd_executable(unit_testunit_test.cpp)target_link_libraries(unit_testgtest_main)include(GoogleTest)gtest_discover_tests(unit_test)库层次的CMakeLists.txt现在,我们来看看包含同名库的子目录Generator中的CMakeLists.txt文件。
这个CMakeLists.txt文件的内容更简短一些,除了单元测试相关的命令外,它仅包含2条语句。
add_library(GeneratorSTATICGenerator.cppGenerator.h)target_include_directories(GeneratorINTERFACE${CMAKE_CURRENT_SOURCE_DIR})我们使用add_library(...)来定义一个新的构建目标:静态的Generator库。
我们使用语句target_include_directories(...)来把当前子目录添加到其它构建目标的头文件的搜索路径之中。
我们也具体指定这个属性的范围为类型INTERFACE:这意味着该属性仅影响链接到这个库的构建目标,而不是库本身。
开始使用VSCodium通过使用CMakeLists.txt文件中的信息,像VSCodium一样的IDE可以相应地配置构建系统。
如果你还没有使用VSCodium或VSCode的经验,这个示例项目会是一个很好的起点。
首先,转到它们的网站,然后针对你的系统下载最新的安装软件包。
打开VSCodium并导航到“扩展Extensions”标签页。
为了正确地构建、调试和测试项目,搜索下面的扩展并安装它们:如果尚未完成,通过单击起始页的“克隆Git存储库CloneGitRepository”来克隆存储库。
或者手动输入:gitclone之后,通过输入如下内容来签出标签devops_1:gitcheckouttags/devops_1或者,通过单击“main”分支按钮(红色框),并从下拉菜单(黄色框)中选择标签。
在你打开VSCodium内部中的存储库的根文件夹后,CMakeTools扩展会侦测CMakeLists.txt文件并立即扫描你的系统寻找合适的编译器。
你现在可以单击屏幕的底部的“构建Build”按钮(红色框)来开始构建过程。
你也可以通过单击底部区域的按钮(黄色框)标记来更改编译器,它显示当前活动的编译器。
要开始调试Producer可执行文件,单击调试器符号(黄色框)并从下拉菜单中选择“调试Debug roducer”(绿色框)。
如上所述,Producer可执行文件要求将元素的数量作为一个命令行的参数。
命令行参数可以在.vscode/launch.json中具体指定。
好了,你现在能够构建和调试项目了。
结束语归功于CMake,不管你正在运行哪种操作系统,上述步骤应该都能工作。
特别是使用与CMake相关的扩展,VSCodium变成了一个强大的IDE。
我没有提及VSCodium的Git集成,是因为你已经能够在网络上查找很多的资源。
我希望你可以看到:提供一个适当的CMake配置文件可以使其他人更容易地构建、使用和贡献于你的项目。
在未来的文章中,我将介绍单元测试和CMake的测试实用程序ctest。
via:作者:StephanAvenwedde选题:lujun9972译者:robsean校对:wxy本文由LCTT原创编译,Linux中国荣誉推出
提供一个适当的CMake配置文件来使其他人可以更容易地构建、使用和贡献你的项目。
这篇文章是使用开源DevOps工具进行C/C++开发系列文章的一部分。
如果你从一开始就把你的项目建立在一个功能强大的工具链上,你的开发会更快和更安全。
除此之外,这会使别人更容易地参与你的项目。
在这篇文章中,我将搭建一个基于CMake和VSCodium的C/C++构建系统。
像往常一样,相关的示例代码可以在GitHub上找到。
我已经测试了在本文中描述的步骤。
这是一种适用于所有平台的解决方案。
为什么用CMake?CMake是一个构建系统生成器,可以为你的项目创建Makefile。
乍一看简单的东西可能相当地复杂。
在较高的层次上,你可以定义你的项目的各个部分(可执行文件、库)、编译选项(C/C++标准、优化、架构)、依赖关系项(头文件、库),和文件级的项目结构。
CMake使用的这些信息可以在文件CMakeLists.txt中获取,它使用一种特殊的描述性语言编写。
当CMake处理这个文件时,它将自动地侦测在你的系统上已安装的编译器,并创建一个用于启动它的Makefile文件。
此外,在CMakeLists.txt中描述的配置,能够被很多编辑器读取,像QtCreator、VSCodium/VSCode或VisualStudio。
示例程序我们的示例程序是一个简单的命令行工具:它接受一个整数来作为参数,输出一个从1到所提供输入值的范围内的随机排列的数字。
$./Producer1038279151064在我们的可执行文件中的main函数,我们只处理输入的参数,如果没有提供一个值(或者一个不能被处理的值)的话,就退出程序。
intmain(intargc,char**argv){if(argc!=2){std::cerrut_of_range&){std::cerrproducer.cpp实际的工作是在生成器中完成的,它将被编译,并将作为一个静态库来链接到我们的Producer可执行文件。
std::stringstream&Generator::generate(std::stringstream&stream,constintrange){std::vectorGenerator.cpp函数generate引用一个std::stringstream和一个整数来作为一个参数。
根据整数range的值n,制作一个在1到n的范围之中的整数向量,并随后打乱。
接下来打乱的向量值转换成一个字符串,并推送到stringstream之中。
该函数返回与作为参数传递相同的stringstream引用。
顶层的CMakeLists.txt顶层的CMakeLists.txt的是我们项目的入口点。
在子目录中可能有多个CMakeLists.txt文件(例如,与项目所相关联的库或其它可执行文件)。
我们先一步一步地浏览顶层的CMakeLists.txt。
第一行告诉我们处理文件所需要的CMake的版本、项目名称及其版本,以及预定的C++标准。
cmake_minimum_required(VERSION3.14)project(CPP_Testing_SampleVERSION1.0)set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_STANDARD_REQUIREDTrue)我们用下面一行告诉CMake去查看子目录Generator。
这个子目录包括构建Generator库的所有信息,并包含它自身的一个CMakeLists.txt。
我们很快就会谈到这个问题。
add_subdirectory(Generator)现在,我们将涉及一个绝对特别的功能:CMake模块。
加载模块可以扩展CMake功能。
在我们的项目中,我们加载了FetchContent模块,这能使我们能够在CMake运行时下载外部的资源,在我们的示例中是GoogleTest。
include(FetchContent)FetchContent_Declare(googletestURL)FetchContent_MakeAvailable(googletest)在接下来的部分中,我们会做一些我们通常在普通的Makefile中会做的事:指定要构建的二进制文件、它们相关的源文件、应该链接的库,以及编译器可以找到头文件的目录。
add_executable(ProducerProducer.cpp)target_link_libraries(ProducerPUBLICGenerator)target_include_directories(ProducerPUBLIC${PROJECT_BINARY_DIR})通过下面的语句,我们使CMake来在构建文件夹中创建一个名称为compile_commands.json的文件。
这个文件会展示项目的每个文件的编译器选项。
在VSCodium中加载该文件,会告知IntelliSense功能在哪里查找头文件(查看文档)。
set(CMAKE_EXPORT_COMPILE_COMMANDSON)最后的部分为我们的项目定义一些测试。
项目使用先前加载的GoogleTest框架。
单元测试的整个话题将会划归到另外一篇文章。
enable_testingadd_executable(unit_testunit_test.cpp)target_link_libraries(unit_testgtest_main)include(GoogleTest)gtest_discover_tests(unit_test)库层次的CMakeLists.txt现在,我们来看看包含同名库的子目录Generator中的CMakeLists.txt文件。
这个CMakeLists.txt文件的内容更简短一些,除了单元测试相关的命令外,它仅包含2条语句。
add_library(GeneratorSTATICGenerator.cppGenerator.h)target_include_directories(GeneratorINTERFACE${CMAKE_CURRENT_SOURCE_DIR})我们使用add_library(...)来定义一个新的构建目标:静态的Generator库。
我们使用语句target_include_directories(...)来把当前子目录添加到其它构建目标的头文件的搜索路径之中。
我们也具体指定这个属性的范围为类型INTERFACE:这意味着该属性仅影响链接到这个库的构建目标,而不是库本身。
开始使用VSCodium通过使用CMakeLists.txt文件中的信息,像VSCodium一样的IDE可以相应地配置构建系统。
如果你还没有使用VSCodium或VSCode的经验,这个示例项目会是一个很好的起点。
首先,转到它们的网站,然后针对你的系统下载最新的安装软件包。
打开VSCodium并导航到“扩展Extensions”标签页。
为了正确地构建、调试和测试项目,搜索下面的扩展并安装它们:如果尚未完成,通过单击起始页的“克隆Git存储库CloneGitRepository”来克隆存储库。
或者手动输入:gitclone之后,通过输入如下内容来签出标签devops_1:gitcheckouttags/devops_1或者,通过单击“main”分支按钮(红色框),并从下拉菜单(黄色框)中选择标签。
在你打开VSCodium内部中的存储库的根文件夹后,CMakeTools扩展会侦测CMakeLists.txt文件并立即扫描你的系统寻找合适的编译器。
你现在可以单击屏幕的底部的“构建Build”按钮(红色框)来开始构建过程。
你也可以通过单击底部区域的按钮(黄色框)标记来更改编译器,它显示当前活动的编译器。
要开始调试Producer可执行文件,单击调试器符号(黄色框)并从下拉菜单中选择“调试Debug roducer”(绿色框)。
如上所述,Producer可执行文件要求将元素的数量作为一个命令行的参数。
命令行参数可以在.vscode/launch.json中具体指定。
好了,你现在能够构建和调试项目了。
结束语归功于CMake,不管你正在运行哪种操作系统,上述步骤应该都能工作。
特别是使用与CMake相关的扩展,VSCodium变成了一个强大的IDE。
我没有提及VSCodium的Git集成,是因为你已经能够在网络上查找很多的资源。
我希望你可以看到:提供一个适当的CMake配置文件可以使其他人更容易地构建、使用和贡献于你的项目。
在未来的文章中,我将介绍单元测试和CMake的测试实用程序ctest。
via:作者:StephanAvenwedde选题:lujun9972译者:robsean校对:wxy本文由LCTT原创编译,Linux中国荣誉推出
目录
- 1 关之琳三级未删减版在线播放
- 2 打屁股电影
- 3 钟丽缇的三级作品在线观看
- ▪ 这就是街舞第二季免费观看
- ▪ 大清御史
- 4 白百合电影
- ▪ 加勒比海盗美人鱼
- ▪ 陪你一起好好吃饭免费观看完整版
- 5 肉浦团3d完整版电影
- 6 赶尸艳谈2未删减版观看
- ▪ 战狼传奇
- ▪ 国产精品嫩草影院在线播放
- ▪ 天堂bt种子资源www在线下载
- 7 今夜不设防无删减版
- ▪ 成龙历险记在线观看免费版
- ▪ 坏掉的我(H) - 海棠书房
- ▪ 国产激情一区二区三区
- ▪ 我的反派男友
- ▪ 年轻的妈妈3在线播放
- 8 美国十次导航
- ▪ 军营NP纯肉妓女
- ▪ 那么多人一起干会坏掉的文章
- ▪ 幽灵医院
- ▪ 女女同三级在线播放
- ▪ 十分钟免费观看视频www
- ▪ 妈妈的女儿2016
- ▪ avove系列在线观看
- ▪ 琉璃厂传奇30集免费观看
- 9 你微笑时很美电视剧
- ▪ 爱情蛙跳跳
- ▪ 爱唯侦查地址
- ▪ 女老师电影
- 10 战地影院
- ▪ 精油按摩
- ▪ 草蜢在线观看完整版视频
- ▪ 我天命大反派免费观看漫画
- ▪ 嗜爱
- ▪ 男女互舔视频
- 11 free hd xxxx tube videos4k
- ▪ 愉悦与苦痛
- ▪ 波斯语课
- ▪ 4399日本高清完整版
- ▪ 宝宝才三根手指就不行啦作文
- ▪ 九九九免费视频
- 12 翁虹三级
- 13 速度与激情7在线观看完整版免费
- 14 羞羞漫画在线登录页面免费漫画入口页面破解
欧美美女大阴口2《欧美美女大阴口2》由来
编辑欧美美女大阴口2《欧美美女大阴口2》起源