首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++最佳实践 | 1. 工具

所有版本,GCC >= 4.3) -Wmisleading-indentation 如果代码中有缩进,但没有对应的代码块,则发出警告(仅在GCC >= 6.0中) -Wduplicated-cond 如果...CMake现在也提供了在正常编译期间调用```clang-tidy```[40]的内置支持。...PVS-Studio PVS-Studio[50]是用于检测用C、C++和C#编写的程序源代码中的bug的工具,对个人学术项目、开源非商业项目和个人开发者的独立项目都是免费的,可以在Windows和Linux...运行时检查 代码覆盖率分析 覆盖率分析工具应该在测试执行时运行,以确保整个应用程序都被测到。不幸的是,覆盖率分析需要禁用编译器优化,这将导致测试执行时间大大延长。...http://www.drmemory.org GCC / Clang Sanitizers 这些工具提供了许多与Valgrind相同的特性,但内置在编译器中,易于使用,并提供问题报告。

3.4K10

使用Zig在arm64上引导Uber的基础设施

-linux-gnu-gcc),而 Clang 接受目标平台作为命令行参数(-target ): 表面上看,用 GCC 和 Clang 交叉编译 C 源文件似乎很容易,但背后都发生了什么?...有些程序使用 Linux 内核的公共头文件,但本例中没有。头文件是特定于目标平台的。...现在我们已经知道交叉编译器使用了哪些东西,我们可以将依赖项分为两类: 特定于主机的工具(编译器、链接器和其他与目标平台无关的程序); 特定于目标平台的库和头文件,它们是为目标平台编译最终程序所必需的。...Zig 需要的依赖项与 Clang 一样,我们来看一下: 工具:C 编译器(Clang)和链接器(lld)。 它们被静态地链接到 Zig 二进制文件中,对于 macOS,Zig 实现了自己的链接器。...我们将 Go 代码库中所有的 Debian 包编译到了 arm64 并发布,尽管它们中的大部分不是我们必需的。与 Docker 镜像类似,CI 确保它们可以编译到 arm64 和 x86_64。

37230
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    转载:【AI系统】传统编译器发展

    有别于一般局限于特定系统与运行环境的编译器,GCC 在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用 GCC 编译,有很大的机会可得到正确无误的输出程序。...总结GCC 目前作为跨平台编译器来说它的兼容性无异是最强的,兼容最强肯定是以牺牲一定的性能为基础,苹果为了提高性能,因此专门针对 mac 系统开发了专用的编译器 Clang 与 LLVM,Clang 用于编译器前段...GCC 作为开源世界的编译器标准一直做得不错,但 Apple 对编译工具会提出更高的要求:一方面,Apple 对 Objective-C 语言(甚至后来对 C 语言)新增很多特性,但 GCC 开发者对...另一方面,GCC 的代码耦合度太高,不好独立,而且越是后期的版本,代码质量越差,但 Apple 想做的很多功能(比如更好的 IDE 支持)需要模块化的方式来调用 GCC,但 GCC 一直没有实现,从根本上限制了...总结因为 GCC 的编译器已经慢慢无法满足苹果的需求,因此苹果开发了 Clang 与 LLVM 来完全取代 GCC。

    10400

    【AI系统】传统编译器发展

    有别于一般局限于特定系统与运行环境的编译器,GCC 在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用 GCC 编译,有很大的机会可得到正确无误的输出程序。...总结GCC 目前作为跨平台编译器来说它的兼容性无异是最强的,兼容最强肯定是以牺牲一定的性能为基础,苹果为了提高性能,因此专门针对 mac 系统开发了专用的编译器 Clang 与 LLVM,Clang 用于编译器前段...GCC 作为开源世界的编译器标准一直做得不错,但 Apple 对编译工具会提出更高的要求:一方面,Apple 对 Objective-C 语言(甚至后来对 C 语言)新增很多特性,但 GCC 开发者对...另一方面,GCC 的代码耦合度太高,不好独立,而且越是后期的版本,代码质量越差,但 Apple 想做的很多功能(比如更好的 IDE 支持)需要模块化的方式来调用 GCC,但 GCC 一直没有实现,从根本上限制了...总结因为 GCC 的编译器已经慢慢无法满足苹果的需求,因此苹果开发了 Clang 与 LLVM 来完全取代 GCC。

    11610

    编译原理基础

    Contents 1 GCC 是什么 2 gcc 与 g++ 的区别 3 Clang 是什么 4 MinGW是什么 5 GTK 是什么 6 GNU 是什么 7 GNU工具链是什么 GCC 是什么 GNU...许多操作系统,包括许多类Unix系统,如Linux及BSD家族都采用GCC作为标准编译器。 GCC原本用C开发,后来因为LLVM、Clang的崛起,它更快地将开发语言转换为C++。...gcc 与 g++ 的区别 学习了几篇博客,发现知乎的一个回答相对表达清楚和准确性,链接在这。 这里的 gcc (小写)与前文的 GCC 含义是不同的。...简单来说,gcc 指的是 GCC 中的 GNU C Compiler(C 编译器);g++ 是 G++ 中的 GNU C++ Compiler(C++ 编译器),但实际上 gcc 和 g++ 都不是编译器...因此用 MinGW 开发的程序不需要额外的第三方 DLL 支持就可以直接在 Windows 下运行,而且也不一定必须遵从 GPL 许可证。

    89110

    斩获 3.4k+ Star 的 C++ Insights:用编译器的视角看源码!

    C++ Insights,特色就是:用编译器的眼睛看源码。...C++ Insights 是一种基于 Clang 的工具,可进行源码到源码的转换,其目标是揭示通常情况下编译器在幕后为我们做的工作。它能帮我们看到编译器为了让代码正常运行而进行的一些神奇操作。.../scripts/getinclude.py` 自定义 GCC 安装 如果你用的是自定义版本的 GCC 编译器,例如 gcc-11.2.0,且未安装在编译器的默认系统路径中,那么在构建后,Clang 将无法找到正确的...如果遇到这种情况,你可以用“--gcc-toolchain=/path/GCC-1x.x.x/installed/path”来告诉 Clang/C++ Insights STL 的位置: ....,能够与最新版本的 Clang 或者至少前一个版本保持兼容,在线网站尽量与 Clang 的最新版本保持一致。

    41410

    4 个快速的 Python 编译器 f

    Nuitka 尽管可以按照下载页面上的说明操作,但 Ubuntu 上的只需: $ sudo apt install Nuitka Nuitka 还需要一个 C 编译器,所以我下载了 clang。...可以使用以下方法安装它: $ sudo apt install clang Nuitka 默认使用 gcc,但是一个参数允许你使用 clang,所以我用两者测试了它。...clang 编译器是 llvm 系列的一部分,旨在作为 gcc 的现代替代品。...CPython是用 C 编写的,所以它是一种通常可以很好地与 Python 混编的语言。 使用 Cython 进行设置有点繁琐,它不像 Nuitka 那样开箱即用。...(Python 冻结包括将应用程序与所需的Python 元素一起放在单个文件(或文件夹)中,而不是编译,这意味着目标不需要Python。)

    1.7K10

    Mac电脑C语言开发的入门帖

    Mac的命令行C语言开发工具主要有两种,clang及gcc,前者是苹果官方推荐的,Xcode也使用Clang进行编译。后者则是GNU开源社区推荐的,并且被大多数linux支持。...正常情况下,编译会很快结束,并且没有错误信息。此外这里使用gcc进行了c语言程序的编译,但并不一定真的是gcc系统,在Mac电脑上默认是使用clang系统,只是为了兼容也伪装成了gcc的调用方式而已。...,这表示我们编辑一个C程序,然后编译、并且运行验证成功了。 以上就是在命令行编辑程序文件,编译并运行所需知道的所有知识。接下来就是你按照C语言课本的要求进行你的各项编程实验了。...第三行是组织名称,第二行的组织信息实际是电脑签名用的证书名称,用于保证编译的程序正装原造,除了你没有被人篡改过。...main.c的内容,实际上已经是一个hello World,直接用鼠标点击左上角的三角键,Xcode会自动对项目进行编译、查错、并运行。屏幕中部右下角的位置,就是程序运行输出的结果。

    1.8K50

    xmake v2.2.9 发布, 新增c++20 modules的实验性支持

    目前xmake已经完全支持了msvc/clang的modules-ts构建实现,而对于gcc,由于它的cxx-modules分支还在开发中,还没有正式进入master,我看了下里面的changelog,...,用这个set_toolchain新接口更好的设置工具链。...对于一些编译器文件名不规则,导致xmake无法正常识别处理为已知的编译器名的情况下,我们也可以加一个工具名提示,例如: set_toolchain("cc", "gcc@$(projectdir)/tools.../bin/mipscc.exe") 上述描述设置mipscc.exe作为c编译器,并且提示xmake作为gcc的传参处理方式进行编译。...socket io 这块的接口初步已经实现,支持lua协程的io调度,实现高并发的io读写(后期还会同时支持进程、pipe的调度支持),目前主要用于xmake自身的使用,用于为后续的远程编译和分布式编译做准备

    98810

    “C不再是一种编程语言”

    几乎任何程序要做任何有用或有趣的事情,它都必须在操作系统上运行。这意味着它必须与那个操作系统交互——而很多操作系统都是用 C 编写的。因此,该语言必须与 C 代码交互,这意味着它必须调用 C API。...如果你希望用你的语言编写的程序成为优秀的公民,可以在主要的操作系统上很好地运行,那么你就需要与操作系统接口进行交互。...当然,也有一些奇怪的 C 语言编译器,如 clang 和 gcc-。...如何与那堆东西进行互操作呢? 你的第一个选项是完全投降,将你的语言与 C 语言进行灵魂绑定,可以采用以下任何一种方式: 用 C(++) 编写编译器 / 运行时,所以它无论如何都能说 C 语言。...让你的“codegen”直接生成 C(++),这样用户就需要一个 C 编译器。 基于一个成熟的主流 C 编译器(gcc 或 clang)构建自己的编译器。

    57920

    “C不再是一种编程语言”

    几乎任何程序要做任何有用或有趣的事情,它都必须在操作系统上运行。这意味着它必须与那个操作系统交互——而很多操作系统都是用 C 编写的。因此,该语言必须与 C 代码交互,这意味着它必须调用 C API。...如果你希望用你的语言编写的程序成为优秀的公民,可以在主要的操作系统上很好地运行,那么你就需要与操作系统接口进行交互。...当然,也有一些奇怪的 C 语言编译器,如 clang 和 gcc-。...如何与那堆东西进行互操作呢? 你的第一个选项是完全投降,将你的语言与 C 语言进行灵魂绑定,可以采用以下任何一种方式: 用 C(++) 编写编译器 / 运行时,所以它无论如何都能说 C 语言。...让你的“codegen”直接生成 C(++),这样用户就需要一个 C 编译器。 基于一个成熟的主流 C 编译器(gcc 或 clang)构建自己的编译器。

    66121

    C 不再是一种编程语言

    当然有一些奇怪的jank C编译器,但Clang和GCC不是: > abi-checker --tests ui128 --pairs clang_calls_gcc gcc_calls_clang...结果发现,一些整数参数在两个由Clang和GCC编译的静态库之间按值传递失败了! Aria发现,Clang和GCC甚至不能就Linux x64上_int128的ABI达成一致。...第一个选择是完全投降,将你的语言与C进行灵魂绑定,这可以是以下任何一种: 用C(++)编写你的编译器/运行时,这样它就可以用C了 C语言学习资源汇总 让你的 "codegen "直接发出C(++),这样用户无论如何都需要一个...C编译器 将你的编译器建立在一个成熟的主要C编译器(Clang或GCC)之上 但上面这些也只能让你走这么远,因为除非你的语言真的暴露了unsigned long long,否则你将继承C的巨大可移植性混乱...现在,虽然表面上可以针对这个目标进行编译,并得到一个在所有这些平台上都能“正常工作”的二进制文件,但Aria不相信有些程序会被编译成intmax_t大于int64_t。

    69730

    【Android 音视频开发打怪升级:FFmpeg音视频编解码篇】一、FFmpeg so库编译

    二、什么是交叉编译 定义 引自百度百科的定义:交叉编译,是在一个平台上生成另一个平台上的可执行代码。 什么意思呢?说白了,就是在一个机器上生成一个程序,这个程序可以跑在另外一个机器上。...编译工具链 对于C/C++的编译,通常有两个工具 GCC 和 CLANG 。...CLANG 则是一个效率更高的C/C++编译工具,并且兼容GCC,Google在很早以前就开始建议使用clang进行编译,并且在 ndk 17 以后,把 GCC 移除了,全面推行使用 CLANG 。...一点疑问 在使用最新的 ndk r20b 版本进行编译的时候发现,即使不配置 sysroot 也可以正常编译,怀疑 Android 的 clang 工具是否经过了处理,会自动去寻找对应的路径。...仔细想想会发现,为什么当 cc 配置为下边的值时,也可以正常编译呢?

    1.9K30

    C 不再是一种编程语言

    当然有一些奇怪的jank C编译器,但Clang和GCC不是: > abi-checker --tests ui128 --pairs clang_calls_gcc gcc_calls_clang...结果发现,一些整数参数在两个由Clang和GCC编译的静态库之间按值传递失败了! Aria发现,Clang和GCC甚至不能就Linux x64上_int128的ABI达成一致。...第一个选择是完全投降,将你的语言与C进行灵魂绑定,这可以是以下任何一种: 用C(++)编写你的编译器/运行时,这样它就可以用C了 让你的 "codegen "直接发出C(++),这样用户无论如何都需要一个...C编译器 将你的编译器建立在一个成熟的主要C编译器(Clang或GCC)之上 但上面这些也只能让你走这么远,因为除非你的语言真的暴露了unsigned long long,否则你将继承C的巨大可移植性混乱...现在,虽然表面上可以针对这个目标进行编译,并得到一个在所有这些平台上都能“正常工作”的二进制文件,但Aria不相信有些程序会被编译成intmax_t大于int64_t。

    76410

    xmake v2.3.4 发布, 更加完善的工具链支持

    比如,我们要从默认的gcc切换到clang编译,可能需要切一些工具集,xmake f --cc=clang --cxx=clang --ld=clang++ --sh=clang++,因为编译器切了,对应的链接器...这也是推荐做法,因为像gcc/clang等大部分编译工具链,编译器和链接器都是配套使用的,要切就得整体切,单独零散的切换设置会很繁琐。...这通常是很有用的,像一些可选的编译flags,即使不支持也能正常编译,但是强行设置上去,其他用户在编译的时候,有可能会因为编译器的支持力度不同,出现一定程度的编译失败。...gcc/clang下可以正常处理,但是msvc下就不支持了 也许我们能通过if is_plat() then来分平台处理,但很繁琐,因此xmake内置了flags的自动映射功能。...基于gcc flags的普及性,xmake采用gcc的flags命名规范,对其根据不同的编译实现自动映射,例如: add_cxflags("-O0") 这一行设置,在gcc/clang下还是-O0,但如果当前是

    1.4K20

    LLVM简介

    优化器:中间代码作为输入,优化中间代码(与架构无关的代码优化),使代码运行更快,体积更小。 后端:生成机器码(根据不同架构x86、x64等生成不同架构的机器码) LLVM架构 ?...LLVM现在被作为实现各种静态和运行时编译语言的通用基础结构(GCC家族、Java、.NET、Python、Ruby、Scheme、Haskell、D等) 什么是Clang Clang是LLVM的项目的子项目...它是LLVM架构下的C/C++\Objective-C的编译器前端。诞生之初是为了替代GCC,提供更快的编译速度。 相比较于GCC,Clang具有如下优点: 编译速度快。...在某些平台上,Clang的编译速度明显快过GCC。Debug模式下,Clang编译OC的速度比GCC快3倍。 占用内存少。...接下来把中间代码转交给优化器,优化器会对中间代码进行与架构无关的代码优化,优化后的代码体积更小、运行速度更快。最终LLVM后端会把优化后的中间代码转化为机器码。

    9.9K11
    领券