C++生态:编译器、IDE、工具、测试等
本文是C++ Ecosystem: Compilers, IDEs, Tools, Testing and More的中文译文。
要编写专业的C++应用程序,不仅需要基本的文本编辑器和编译器,还需要更多工具。在这篇博客中,您将看到使C++编程成为可能的大量工具:编译器,IDE,调试器等。
注意:这是基于Embarcadero创建的白皮书的博客,请在此处查看全文: C++ Ecosystem White Paper 。
Introduction
C++编程语言已经成为使用最广泛的现代编程语言之一。使用C++构建的软件以其性能和效率而闻名。随着不断地发展和壮大,C++已经用于构建众多广受欢迎的核心库,Microsoft Office之类的应用程序,Unreal之类的游戏引擎,Adobe Photoshop之类的软件工具,Clang之类的编译器,MySQL之类的数据库,甚至包括Windows之类的操作系统。
通常将现代C++定义为利用基于C++11,C++14和C++17的编译器中的语言功能的C++代码。这些语言标准以其定义的年份命名(分别为2011、2014和2017年),包括对原始核心语言的大量重要添加和增强,以实现强大的,高性能和无bug的代码。现代C++具有支持面向对象编程,函数编程,泛型编程和低级内存操作等高级功能。
计算机行业的知名公司,例如Microsoft,Intel,自由软件基金会等,都有其现代的C++编译器。诸如Microsoft,QT Company,JetBrains和Embarcadero之类的公司提供了用于编写现代C++代码的集成开发环境。适用于C++的流行库可用于多个计算机学科,包括人工智能,机器学习,机器人技术,数学,科学计算,音频处理和图像处理。
在此博客文章中,我们将介绍许多这样的编译器,构建工具,IDE,库,框架,编码助手,以及更多可以支持和增强现代C++开发的内容。
让我们开始吧!
编译器
有许多支持现代C++的流行编译器,包括GCC/g++,MSVC(Microsoft Visual C++),Clang和Intel Compiler。每个编译器对主要操作系统的支持都不同,开源GCC/g++始于1980年代后期,Microsoft的Visual C++始于1990年代初,而Clang则在2000年代后期。所有这四个编译器都支持现代C++,至少支持C++17,但是它们各自的源代码许可差异很大。
GCC
GCC是由GCC指导委员会开发,维护和定期更新的通用编译器,属于GNU项目。GCC描述了针对许多硬件平台和多种语言的庞大的编译器家族。虽然它主要针对类Unix平台,但Windows可以通过Cygwin或MinGW运行时库提供支持。GCC能编译最新的C++代码,直至C++17,并提供了对某些C++20功能的实验性支持。它还可以编译基于C++标准的各种语言扩展。它是免费并开源的(GPL3),但GCC运行时库是个例外。GCC获得了诸如CMake和Ninja之类的构建工具以及诸如CLion,Qt Creator和Visual Studio Code之类的许多IDE的支持。 https://gcc.gnu.org/ https://gcc.gnu.org/projects/cxx-status.html
Microsoft Visual C++
Microsoft Visual C++(MSVC)是Microsoft的编译器,用于实现自定义的C++标准(称为Visual C++)。它会定期更新,并且像GCC和Clang一样, 支持现代C++标准,直到C++17, 并提供对某些C++ 20功能的实验性支持。MSVC是在Microsoft自家的Visual Studio中构建C++应用程序的主要方法。它通常针对Windows,Android,iOS和Linux上的许多体系结构。对构建工具和IDE的支持是有限的,但仍在增长。CMake扩展在Visual Studio 2019中可用。MSVC可以与Visual Studio Code一起使用,通过额外的扩展,CLion和Qt Creator能提供有限支持。MSVC是专有的,可以通过商业许可获得,但是还有社区版。 https://zh.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B https://devblogs.microsoft.com/visualstudio/ https://visualstudio.microsoft.com/vs/community/
Clang
Clang描述了作为LLVM项目的一部分而维护和定期开发的 C语言族的大量编译器。尽管它针对许多流行的体系结构,但是不如GCC多。LLVM项目通过关键设计原则定义了Clang——严格遵守C++标准(尽管提供了对GCC扩展的支持),模块化设计以及在编译过程中对源代码的结构进行的最小修改等。像GCC一样,Clang能编译具有支持C++17标准和实验性C++20的现代C++代码。它可以在开源(Apache许可证版本2.0)许可下使用。Clang还得到了诸如CMake和Ninja之类的构建工具以及诸如CLion,Qt Creator,Xcode之类的IDE的广泛支持。 https://clang.llvm.org/ https://clang.llvm.org/cxx_status.html
Intel C++ 编译器
Intel C++编译器可以为各种Intel CPU(包括Xeon,Core和Atom处理器)生成高度优化的代码。该编译器可以与流行的IDE(例如Visual Studio,GCC工具链等)无缝集成。它可以利用高级指令集(甚至是AVX512)生成并行代码(例如,感谢OpenMP 5.0的支持)。Intel没有将编译器与标准库一起提供,因此它使用平台上提供的库。该编译器作为Intel Parallel Studio XE或Intel System Studio的一部分提供。 https://software.intel.com/zh-cn/c-compilers https://software.intel.com/zh-CN/articles/c17-features-supported-by-intel-c-compiler
构建工具&包管理器
在编译器之上,你需要一个有助于构建整个应用程序的基础设施:构建工具,流水线和包管理器。
Make
Make是广泛使用的知名构建系统,尤其是在Unix和类Unix操作系统中。Make通常用于从源代码构建可执行程序和库。但是该工具适用于涉及执行任意命令以将源文件转换为目标结果的任何过程。Make与任何特定的编程语言都不紧密。它会自动确定已更改了哪些源文件,然后执行最少的构建过程以获取最终输出。它还有助于将程序安装到系统。 https://www.gnu.org/software/make/
Cmake
CMake是用于管理构建过程的跨平台工具。大型应用程序和依赖库的构建,可能是一个非常复杂的过程,尤其是当支持多个编译器时。CMake对此进行了抽象。你可以使用一种通用语言定义复杂的构建过程,并将其转换为适用于受支持的编译器,IDE和构建工具(包括Ninja,如下所示)的本机构建指令。有适用于Windows,macOS和Linux的CMake版本。 https://cmake.org/
注意:这是关于Make和Cmake 之间区别的一个很好的答案:使用Makefile和CMake编译代码的区别-Stack Overflow。
Ninja
Ninja构建系统用于构建应用程序的实际过程,类似于Make。它着重于通过并行化构建来尽可能快地运行。它通常与CMake配对使用,后者支持为Ninja构建系统创建构建文件。Ninja的功能集故意保持最小,因为重点在于速度。 https://ninja-build.org/
Microsoft Build Engine (MSBuild)
MSBuild是一个基于命令行的构建平台,可从Microsoft获得开源(MIT)许可。 它可用于自动化编译和部署项目的过程。它可以独立使用,与Visual Studio打包在一起,也可以从Github获得。MSBuild文件的结构和功能与Make非常相似。MSBuild具有基于XML的文件格式,主要支持Windows,但也支持macOS和Linux。诸如CLion和C++ Builder之类的IDE也可以与MSBuild集成。 https://docs.microsoft.com/zh-cn/visualstudio/msbuild/msbuild
Conan, Vcpkg, Buckaroo
诸如Conan,vcpkg,Buckaroo和NIX之类的软件包管理器在C++社区中已经越来越流行。软件包管理器是用于安装库或组件的工具。
Conan是一个分布式开源(MIT)软件包管理器,它支持多个平台和所有构建系统(例如CMake和MSBuild)。Conan支持二进制文件,其目标是自动化依赖性管理,以节省开发和持续集成的时间。
微软的vcpkg是根据MIT许可开放的源代码,并支持Windows,macOS和Linux。开箱即用,它使已安装的库在Visual Studio中可用,但它也支持CMake构建配方。它可以为每个可以安装到CMake的工具链构建库。
Buckaroo是一个鲜为人知的开源软件包管理器,可以从GitHub,BitBucket,GitLab等获取依赖项。Buckaroo为许多IDE提供了集成,包括CLion,Visual Studio Code,XCode等。
以下是上述软件包管理器的链接:
集成开发环境
大量的编辑器和集成开发环境(IDE)可用于现代C++开发。文本编辑器通常是轻量级的,功能不如IDE完善,仅用于编写代码的过程,而不用于调试或测试。全面开发需要其他工具,而IDE包含这些工具并集成到一个紧密集成的集成开发环境中。可以使用许多文本编辑器(例如Sublime Text,Atom,Visual Studio Code,vi/vim和Emacs)编写C++代码。但是,有些IDE是专门为现代C++而设计的,例如CLion,Qt Creator和C++ Builder,而Xcode和Visual Studio等IDE也支持其他语言。
你还可以在Wikipedia上的此方便表格中比较各种C++ IDE: 集成开发环境的比较-C++-Wikipedia
Sublime Text, Atom和Visual Studio Code
下面的列表总结了一组高级源代码编辑器,这些编辑器得益于各种插件和扩展,可以使用几乎所有编程语言创建应用程序。
-
Sublime Text是一种商业文本编辑器,可通过插件扩展对现代C++的支持。
-
Atom是一个开放源代码(MIT许可证)文本编辑器,它通过具有可用于调试和编译的集成的软件包来支持现代C++。
-
Visual Studio Code是Microsoft提供的流行的开源(MIT许可)源代码编辑器。它提供了许多扩展,这些扩展将诸如调试和代码完成功能引入到Visual Studio Code。
Sublime Text,Atom和Visual Studio Code都可用于Windows,macOS和Linux。
以下是上述工具的链接:
- https://www.sublimetext.com/
- https://atom.io/
- https://code.visualstudio.com/
Vi/Vim & Emacs
Vi/Vim和Emacs是基于命令行的免费文本编辑器,主要在Linux上使用,但也可用于macOS和Windows。可以通过使用脚本将现代C++支持添加到Vi/Vim,也可以通过使用模块将现代C++支持添加到Emacs。 https://www.vim.org/ https://www.gnu.org/software/emacs/
Clion
CLion是JetBrains的商业IDE,支持现代C++。它可以与CMake和Gradle等构建工具一起使用,与GDB和LLDB调试器集成,可以与版本控制系统(例如Git),测试库(例如Boost.Test)和各种文档工具一起使用。它具有代码生成,重构,动态代码分析,符号导航等功能。 https://www.jetbrains.com/clion/
Qt Creator
Qt Creator是Qt Company的(非)商业IDE,支持Windows,macOS和Linux。Qt Creator具有UI设计,语法高亮显示,自动完成以及与许多不同的现代C++编译器(例如GCC和Clang)集成的功能。Qt Creator与Qt库紧密集成,可快速构建跨平台应用程序。此外,它与标准版本控制系统(如Git),调试器(如GDB和LLDB),构建系统(如CMake)集成,并且可以跨平台部署到iOS和Android设备。 https://www.qt.io/
C++Builder
C++ Builder是Embarcadero Technologies的商业IDE,可在Windows上运行并支持现代C++。它具有屡获殊荣的用于Windows开发的Visual Component Library(VCL)和用于Windows,iOS和Android的跨平台开发的FireMonkey(FMX)。C++ Builder编译器具有Clang的增强版本,集成的调试器,可视UI设计器,数据库,全面的RTL,以及诸如语法高亮显示,代码完成和重构的标准功能。C++ Builder可以与CMake集成,也可以与Ninja以及MSBuild一起使用。 https://www.embarcadero.com/products/cbuilder https://www.embarcadero.com/products/cbuilder/starter
Visual Studio
Visual C++是Microsoft的商业Visual Studio IDE。Visual Studio在IDE中集成了构建,调试和测试。它提供了Microsoft基础类库(MFC),该库提供对Win32 API的访问。Visual Studio具有用于某些平台的可视UI设计器,附带MSBuild,支持CMake并提供标准功能,例如代码完成,重构和语法高亮显示。此外,Visual Studio支持许多其他编程语言,其C++方面侧重于Windows,并逐渐添加了其他平台。 https://visualstudio.microsoft.com/
Xcode
Xcode是Apple提供的多语言IDE,仅在支持现代C++的macOS上可用。Xcode是专有的,但可从Apple免费获得。Xcode具有集成的调试器,支持Git等版本控制系统,具有Clang编译器,并使用libc++作为其标准库。它支持语法突出显示,代码完成等标准功能,最后,Xcode支持CMake等外部构建系统并使用LLDB调试器。 https://developer.apple.com/xcode/
KDevelop
KDevelop(其0.1版本于1998年发布)是用于C,C ++,Python,QML/JavaScript和PHP的跨平台IDE。该IDE是KDE项目的一部分,基于KDE Frameworks和Qt。C/C++后端使用Clang和LLVM。它具有与多个版本控制系统的UI集成:Git,SVN,Bazaar等,基于CMake,QMake或自定义makefile的构建过程。在许多有趣的功能中,必须提到高级语法着色和上下文相关的语义代码完成功能。
https://www.kdevelop.org/ https://www.kdevelop.org/features
Eclipse CDT IDE
Eclipse C/C++开发工具包(CDT)是Eclipse IDE与C++工具链(通常是GNU-GCC)的组合。该IDE支持项目创建和各种工具链的构建管理,例如标准的make构建。CDT IDE提供源文件导航,各种源知识工具,例如类型层次结构,调用图,包括浏览器,宏定义浏览器,带有语法高亮显示功能的代码编辑器,折叠和超链接导航,源代码重构和代码生成,可视化调试工具(包括内存) ,注册和反汇编查看器。 https://www.eclipse.org/cdt/
Cevelop
Cevelop是基于Eclipse CDT的功能强大的IDE。它的主要优势在于对代码现代化的强大重构和静态分析支持。此外,它还带有单元测试和对CUTE单元测试框架的TDD支持。此外,你可以轻松地可视化模板实例化/函数重载解析并优化includes。 https://www.cevelop.com/
Android Studio
Android Studio是Google的Android操作系统的正式IDE,它基于JetBrains的IntelliJ IDEA软件构建,并专门为Android开发而设计。可在Windows,macOS和Linux操作系统上下载使用。它替代了Eclipse Android开发工具(ADT),后者是原生Android应用程序开发的主要IDE。
Android Studio主要关注Kotlin…,但是您也可以使用C++编写应用程序。
Oracle Studio
Oracle Developer Studio是Oracle针对Solaris和Linux操作系统的旗舰软件开发产品。它包括针对SPARC和x86平台上的Solaris,以及x86/x64平台(包括多核系统)上的Linux优化的C,C ++和Fortran编译器,库以及性能分析和调试工具。你可以免费下载Developer Studio,但是如果你想获得完整的支持和补丁更新,则需要付费。C++编译器支持C++14。 https://www.oracle.com/technetwork/server-storage/developerstudio/overview/index.html https://www.oracle.com/technetwork/server-storage/solarisstudio/features/compilers-2332272.html
另外:编译器体验&在线工具
如果你想检查一些较短的代码示例,而又不想安装整个编译器/IDE套件,那么我们有许多在线工具可以使这些测试变得非常简单。只需打开网络浏览器并输入代码。
Compiler Explorer是一个基于Web的工具,使你可以从多种C++编译器和同一编译器的不同版本中进行选择,以测试代码。这使开发人员可以在编译器之间比较为特定C++构造生成的代码,并测试正确性。不仅有Clang,GCC和MSVC,还有鲜为人知的编译器,例如DJGPP,ELLCC,Intel C++等。 https://godbolt.org/
另外:这是你可以使用的便捷在线编译器的列表:例如Coliru,Wandbox,CppInsighs等:https://arnemertz.github.io/online-compilers/
调试&测试
GDB
GDB是一个便携的基于命令行的调试平台,支持现代C ++,可在开放源代码许可(GPL)下使用。许多编辑器和IDE(例如Visual Studio,Qt Creator和CLion)都支持与GDB集成。它也可以用于远程调试应用程序,其中GDB在一个设备上运行,而被调试的应用程序在另一设备上运行。它支持许多平台,包括Windows,macOS和Linux。 https://www.gnu.org/software/gdb/
LLDB
LLDB是一个开源调试接口,支持现代C++并与Clang编译器集成。它具有许多可选的性能增强功能,例如JIT,还支持调试内存,多线程和机器代码分析。它是用C++构建的。LLDB是Xcode的默认调试器,可与Visual Studio Code,CLion和Qt Creator一起使用。它支持许多平台,包括Windows,macOS和Linux。 https://lldb.llvm.org/
Debugging Tools For Windows
在Windows上,你可以使用多种调试器,包括Visual Studio调试器(集成的并且是最易于使用的工具之一),WinDBG,CDB等。
WinDbg是用于Microsoft Windows平台的多功能调试器。它可用于在内核模式下调试用户模式应用程序,设备驱动程序和操作系统本身。它具有图形用户界面(GUI),并且比Visual Studio Debugger功能更强大。你甚至可以调试从内核驱动程序获得的内存转储。
Windows上的调试中最近令人兴奋的功能之一称为“时间旅行调试”(在WinDBG Preview和Visual Studio Ultimate中都可用)。它使你可以记录进程的执行情况,然后向后或向前重放步骤。这种灵活性使我们能够轻松地追溯导致错误的状态。
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/ https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/time-travel-debugging-overview
Mozilla’s RR
RR是一个高级调试器,旨在替代Linux上的GDB。它提供了应用程序的完整状态记录,因此你可以向后和向前重放操作(类似于“时间旅行调试”)。该调试器用于处理Chrome,OpenOffice甚至Firefox代码库等大型应用程序。 https://rr-project.org/
CATCH/CATCH2
Catch2是用于现代C++的跨平台开源(BSL-1.0)测试框架。它非常轻巧,因为仅需要包含头文件。单元测试可以标记并成组运行。它支持测试驱动的开发和行为驱动的开发。Catch2还可以轻松与CLion集成。 https://github.com/catchorg/Catch2
BOOST.TEST
Boost.Test是使用现代C++标准构建的功能丰富的开源(BSL-1.0)测试框架。它可以通过可自定义的日志记录和实时监视来快速检测错误,故障和超时。可以将测试分组到套件中,并且该框架支持小规模测试和大规模测试。 https://github.com/boostorg/test
GOOGLE TEST
Google Test是Google的C++测试和模拟框架,可以通过开源(BSD)许可获得。Google测试可以在多种平台上使用,包括Linux,macOS,Windows等。它包含一个单元测试框架,断言,死亡测试,检测故障,处理参数化测试以及创建XML测试报告。 https://github.com/google/googletest
CUTE
CUTE是集成到Cevelop中的单元测试框架,但也可以独立使用。它涵盖从c++ 98到c++ 2a的C++版本,并且仅包含头文件。虽然不如Google Test流行,但它的宏缠结较少,并且仅在没有适当的C++功能可用的情况下使用宏。另外,通过回避某些I/O格式化功能,它具有一种可轻松在嵌入式平台上运行的模式。 https://cute-test.com/
DocTest
DocTest是一个单个头文件的单元测试框架。适用于C++ 11到C++ 20,易于配置并且可以在所有平台上使用。它提供常规的TDD测试宏(也包含子用例)以及BDD样式的测试用例。 http://bit.ly/doctest-docs https://github.com/onqtam/doctest
Mull
Mull是用于变异测试的基于LLVM的工具,重点关注C和C ++语言。通常,它会创建源代码的许多变体(使用LLVM字节码),然后针对测试用例进行检查。借助这种先进的测试技术,可以使代码更安全。 https://github.com/mull-project/mull PDF:https://lowlevelbits.org/pdfs/Mull_Mutation_2018.pdf
Sanitizers
- AddressSanitizer- https: //clang.llvm.org/docs/AddressSanitizer.html (在Clang,GCC和XCode中受支持)
- UndefinedBehaviorSanitizer- https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
- LeakSanitizer- https://clang.llvm.org/docs/LeakSanitizer.html
- 适用于Windows的应用程序验证程序-https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/application-verifier
Sanitizers是相对较新的工具,可以为你的应用程序添加额外的工具(例如,它们替换了new/malloc/delete调用),并且可以检测各种运行时错误:泄漏,删除后使用,双重释放以及许多其他错误。为了改善构建流程,许多指南建议在进行测试时添加Sanitizers步骤。大多数Sanitizers都来自LLVM/Clang平台,但现在它们也可以与GCC一起使用。不幸的是,Visual Studio还没有(但是你可以尝试Application Verifier)。
Valgrind
Valgrind是用于构建动态分析工具的基础框架。Valgrind工具可以自动检测许多内存管理和线程错误,并详细描述程序。通过Valgrind运行程序时,程序将在模拟主机环境的虚拟机上运行。有了这种抽象,这些工具就可以利用源代码及其执行的各种信息。 http://valgrind.org/ http://valgrind.org/info/about.html http://valgrind.org/docs/manual/quick-start.html
HeapTrack
HeapTrack是一个FOSS项目,并且是Linux的堆内存分析器。它跟踪所有内存分配,并使用堆栈跟踪对这些事件进行注释。该工具有两种形式:可获取数据的命令行版本,以及用于读取和分析结果的UI部分。该工具可与Valgrind的massif相媲美。对于大型项目,它更易于使用,并且加载和分析起来应该更快。 https://github.com/KDE/heaptrack
Dr. Memory
Dr. Memory是LGPL许可的工具,可让你监视和增强Windows,Linux,Mac,Android上二进制文件的与内存相关的错误。它基于DynamoRIO动态仪表工具平台。使用该工具,你可以发现两次释放,内存泄漏,句柄泄漏(在Windows上),GDI问题,对未初始化的内存的访问,甚至在多线程内存方案中的错误等。 http://drmemory.org/ https://github.com/DynamoRIO/drmemory
Deleaker
Deleaker的主要作用是查找应用程序中的泄漏。它支持Visual Studio(从2008年到最新的2019版本),Delphi/C++ Builder,Qt Creator,CLion(很快会支持!)。可用作Visual Studio中的扩展或独立应用程序。Deleaker跟踪C/C++应用程序(原生和CLR)以及.NET代码中的泄漏。内存(new/delete,malloc…),GDI对象,User32对象,句柄,文件视图,Fibres,Critical Sections等等。它收集完整的调用堆栈,可以拍摄快照,比较快照,查看与内存分配相关的源文件。 https://www.deleaker.com/ https://www.deleaker.com/docs/deleaker/tutorial.html
总结&更多
我希望上面的清单对C++开发必不可少的工具有一个有用的概述。
如果你想了解其他生态要素的更多信息:库,框架和其他工具,请参阅Embarcadero的完整报告: C ++生态系统白皮书 (这是一个非常漂亮的pdf,内容超过20页!)
你可以在此参考资料中找到帮助C++开发的工具,库和框架的超长列表:https://github.com/fffaraz/awesome-cpp