<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Clang on I'm OWenT</title><link>//owent.net/tags/clang.html</link><description>Recent content in Clang on I'm OWenT</description><generator>Hugo</generator><language>zh-cn</language><copyright>&lt;a rel="license" href="https://github.com/owent/blog-hugo/blob/master/LICENSE.md"&gt;&lt;img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/80x15.png" /&gt;&lt;/a&gt;</copyright><lastBuildDate>Sun, 17 Apr 2022 23:43:45 +0000</lastBuildDate><atom:link href="//owent.net/tags/clang/index.xml" rel="self" type="application/rss+xml"/><item><title>再度优化GCC、LLVM、Clang、libc++、libc++abi等套件的构建脚本</title><link>//owent.net/2022/2205.html</link><pubDate>Sun, 17 Apr 2022 23:43:45 +0000</pubDate><guid>//owent.net/2022/2205.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;一直以来，我都维护了完整的 &lt;a href="https://github.com/owent-utils/bash-shell/tree/main/GCC%20Installer"&gt;GCC 工具链构建工具&lt;/a&gt; 和 &lt;a href="https://github.com/owent-utils/bash-shell/tree/main/LLVM%26Clang%20Installer"&gt;LLVM,Clang,libc++,libc++abi工具链构建工具&lt;/a&gt; 。&#10;一方面是为了测试和体验新版本编译器的功能和利用一些更现代化的工具检查代码中的风险，另一方面也是为了给我得很多开源仓库做多版本适配。&#10;其中所有的编译期依赖项（不包括 tar,awk等可执行程序的工具）都是自己构建的，这样也能管理好某些新版本组件需要的新版本依赖项，并且做到跨发行版兼容。同时很多发行版自带的 LLVM+Clang 套件都缺斤少两，有的缺少 &lt;code&gt;clang-analyzer&lt;/code&gt; ，有的缺少 &lt;code&gt;clang-format&lt;/code&gt; ，也有的缺少 &lt;code&gt;libc++&lt;/code&gt; 和 &lt;code&gt;libc++abi&lt;/code&gt; 或者缺少sanitizer组件。我也是根据自己的需要编译并输出了大多数开发工具，甚至还有一些开发库以便二次开发（比如用libclang写工具来复用libcang的AST功能）。&lt;/p&gt;</description></item><item><title>记录一些bazel适配用编译选项</title><link>//owent.net/2022/2202.html</link><pubDate>Mon, 14 Feb 2022 20:36:45 +0000</pubDate><guid>//owent.net/2022/2202.html</guid><description>&lt;p&gt;之前搞 &lt;a href="https://github.com/open-telemetry/opentelemetry-cpp"&gt;opentelemetry-cpp&lt;/a&gt; 的时候接触了下 &lt;a href="https://bazel.build/"&gt;bazel&lt;/a&gt; 构建系统。这玩意儿用起来有一点坑，特别是使用自定义编译环境的时候。&lt;/p&gt;&#10;&lt;p&gt;在使用我自己编译的很新版本的 &lt;a href="https://github.com/owent-utils/bash-shell/tree/main/GCC%20Installer"&gt;GCC&lt;/a&gt; 和 &lt;a href="https://github.com/owent-utils/bash-shell/tree/main/LLVM%26Clang%20Installer"&gt;clang+libc++&lt;/a&gt; 的时候，涉及对libssp的检测和 &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; 环境变量在 &lt;a href="https://bazel.build/"&gt;bazel&lt;/a&gt; 中各个步骤中的传递，这里记录一下适配脚本。&lt;/p&gt;</description></item><item><title>再次重构LLVM+Clang+libcxx+libc++abi+其他相关工具的构建流程</title><link>//owent.net/2021/2107.html</link><pubDate>Sun, 29 Aug 2021 20:29:56 +0000</pubDate><guid>//owent.net/2021/2107.html</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;我们有时候写一些基础性类库或者实验新功能的时候，常常需要使用到最新版本的GCC和Clang。一些Linux发行版的源里和一些工具链（比如MSYS2）里其实自带LLVM套件的包，&lt;a href="https://llvm.org/"&gt;LLVM&lt;/a&gt; 官网也提供一些常见平台的预编译包下载。&#10;那为什么我们还要自己编译呢？如果有注意到的小伙伴可能会发现，很多平台的源和 &lt;a href="https://llvm.org/"&gt;LLVM&lt;/a&gt; 官网 里下载的预编译包，其实是缺失很多组件的。有些没有libc++和libc++abi（CentOS 8），有些没有Sanitizer相关的组件，有些缺失其他的组件。而Clang虽然支持GCC的libstdc++，但是一方面我们写基础性类库还是要优先考虑原生STL库的兼容性，另一方面Clang对libstdc++的支持也不是太好，特别是有些第三方库在这个组合下也是没有适配得很好，同时gdb和libc++的搭配有时候也不是很完善。&#10;所以我们就需要一个组件尽可能开完整地包含LLVM，Clang,libc++,libc++abi还有其他周边工具（各类Sanitizer，clang-tiny,clang-analyzer等等）的工具链。&lt;/p&gt;</description></item><item><title>新版GCC和LLVM+Clang终于Release啦</title><link>//owent.net/2021/2105.html</link><pubDate>Sun, 16 May 2021 14:34:34 +0000</pubDate><guid>//owent.net/2021/2105.html</guid><description>&lt;p&gt;可能是疫情的原因，GCC好久没发布啦。最近总于又Release了，还是大版本。并且三大编译器对C++20的支持也都七七八八了。所以特意立贴庆祝一下，顺带更新一波构建脚本把这两年的一些改动列举一下。&lt;/p&gt;&#10;&lt;h2 id="gcc编译"&gt;GCC编译&lt;/h2&gt;&#10;&lt;p&gt;构建脚本的主要变化如下:&lt;/p&gt;</description></item><item><title>C++20 Coroutine 性能测试 (附带和libcopp/libco/libgo/goroutine/linux ucontext对比)</title><link>//owent.net/2019/1911.html</link><pubDate>Sat, 05 Oct 2019 14:52:00 +0000</pubDate><guid>//owent.net/2019/1911.html</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;之前写了 &lt;a href="https://owent.net/2018/1806.html"&gt;《协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比》&lt;/a&gt; 和 &lt;a href="https://owent.net/2019/1904.html"&gt;《C++20 Coroutine》&lt;/a&gt; ，但是一直没写 &lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;C++20 Coroutine&lt;/a&gt; 的测试报告。&lt;/p&gt;&#10;&lt;p&gt;现在的草案版本比我当时写 &lt;a href="https://owent.net/2019/1904.html"&gt;《C++20 Coroutine》&lt;/a&gt; 的时候有了一点点更新，&lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;cppreference&lt;/a&gt; 上有文档了(&lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;https://en.cppreference.com/w/cpp/language/coroutines&lt;/a&gt;) 。里面列举的标准文档是&lt;a href="https://owent.net/2019/1904.html"&gt;P0912R5&lt;/a&gt;，这个文档目前还没完工，详情可以看他的来源&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/n4775.pdf"&gt;N4775&lt;/a&gt;。不过内容上暂时还没有太大的变化，今天我就照着之前的方式来benchmark一波 &lt;a href="https://en.cppreference.com/w/cpp/language/coroutines"&gt;C++20 Coroutine&lt;/a&gt; 吧。&lt;/p&gt;&#10;&lt;h2 id="压力测试机环境"&gt;压力测试机环境&lt;/h2&gt;&#10;&lt;p&gt;为了方便比较，我更新了一下之前在 &lt;a href="https://owent.net/2018/1806.html"&gt;《协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比》&lt;/a&gt; 里的测试项目的版本。Windows环境仅仅是为了测试MSVC下的性能，因为GCC还不支持所以Linux下是使用Clang编译的。&lt;/p&gt;</description></item><item><title>C++20 Coroutine</title><link>//owent.net/2019/1904.html</link><pubDate>Mon, 04 Mar 2019 20:38:00 +0000</pubDate><guid>//owent.net/2019/1904.html</guid><description>&lt;h1 id="前言"&gt;前言&lt;/h1&gt;&#10;&lt;p&gt;最近的新闻里 C++20 已经确认的内容里已经有了协程组件，之前都是粗略看过这个协程草案。最近抽时间更加系统性的看了下接入和实现细节。&lt;/p&gt;&#10;&lt;p&gt;我的测试代码都是在MSVC下开启 &lt;code&gt;/await&lt;/code&gt; 选项后测试的，在我本地的Linux clang环境中，可以通过 &lt;code&gt;$LLVM_CLANG_PREFIX/bin/clang++ -std=c++2a -O0 -g -ggdb -stdlib=libc++ -fcoroutines-ts -lc++ -lc++abi -Wl,-rpath=$LLVM_CLANG_PREFIX/lib/ test.cpp&lt;/code&gt; 编译和运行。&lt;/p&gt;</description></item><item><title>C++的backtrace</title><link>//owent.net/2018/1801.html</link><pubDate>Mon, 08 Jan 2018 17:55:00 +0000</pubDate><guid>//owent.net/2018/1801.html</guid><description>&lt;h1 id="开始之前"&gt;开始之前&lt;/h1&gt;&#10;&lt;p&gt;很多语言的log模块都有一个功能，就是在打log的时候能够追溯调用栈，有的时候对查bug能有点帮助。之前我也想过给我们的log模块加上C++的backtrace的功能，迟迟一直没有做主要是两个原因：一是C++的backtrace在各个平台和编译器上都不太一样，比较冗杂；二是C/C++在编译优化之后，调用行之类的信息和甚至一些函数可能就被优化没了。所以能提供的信息就相当有限。前两天刚好有朋友问有没有提供这个，所以就花了点时间整理了下适配方案。&lt;/p&gt;</description></item><item><title>GCC 7和LLVM+Clang+libc++abi 4.0的构建脚本</title><link>//owent.net/2017/1431.html</link><pubDate>Tue, 09 May 2017 11:17:55 +0000</pubDate><guid>//owent.net/2017/1431.html</guid><description>&lt;p&gt;之前的版本发完，有空来更新一下之前的gcc和llvm+clang工具链的编译脚本了。其实GCC 7是才release没多久但是llvm 4.0发布其实有一段时间了。&lt;/p&gt;&#10;&lt;h2 id="gcc"&gt;GCC&lt;/h2&gt;&#10;&lt;p&gt;这回是GCC的脚本有一些改动。因为我现在开发机的环境很多组件并没有装，所以顺带发现了之前的构建脚本的一些问题。&lt;/p&gt;</description></item><item><title>重写了llvm+clang+libc++和libc++abi的构建脚本</title><link>//owent.net/2016/1309.html</link><pubDate>Sat, 19 Nov 2016 15:42:21 +0000</pubDate><guid>//owent.net/2016/1309.html</guid><description>&lt;p&gt;由于之前整理的服务器框架已经完成了，就需要用各种静态分析工具跑一遍。原来的llvm+clang的编译脚本是从GCC那个脚本copy过来然后改的，使用的时候各种问题。所以干醋重新折腾一遍，重写了。&lt;/p&gt;&#10;&lt;p&gt;之前的脚本，每次升级版本都要折腾下，一开始是编译的默认静态库巨大无比，后来改成动态库后一会儿好一会儿不好。&#10;目测3.9.0版本的问题是开启动态库的编译模式以后有些子工程还是静态库，并且会漏掉加-fPIC，即便我在cmake的选项里加了也没用。&#10;而且有时候是用gcc编译正常，用clang自举编译的时候失败。&#10;然后每次测试一次都要花费巨量的时间，巨慢无比。我只是编译出来玩+当某些工具使用啊喂。要不要这么折腾我啊喂。&lt;/p&gt;</description></item><item><title>LLVM+Clang+Libcxx+Libcxxabi（3.6）工具链编译（完成自举编译）</title><link>//owent.net/2015/1149.html</link><pubDate>Wed, 08 Apr 2015 17:41:02 +0000</pubDate><guid>//owent.net/2015/1149.html</guid><description>&lt;p&gt;LLVM和Clang工具链的生成配置文件写得比较搓，所以略微麻烦，另外这个脚本没有经过多环境测试，不保证在其他Linux发行版里正常使用。&lt;/p&gt;&#10;&lt;h3 id="change"&gt;CHANGE&lt;/h3&gt;&#10;&lt;h4 id="相对于上一个版本linux-编译安装-llvm--clang-35的变化"&gt;相对于上一个版本&lt;a href="../3.5"&gt;Linux 编译安装 LLVM + Clang 3.5&lt;/a&gt;的变化：&lt;/h4&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;这个版本llvm的源码修复了一个会导致开启exception功能之后的编译bug，所以编译脚本不再会修改llvm的源代码&lt;/li&gt;&#10;&lt;li&gt;编译过程改成了两次编译&lt;/li&gt;&#10;&lt;li&gt;编译过程完全使用cmake。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;终于自举编译成功啦&lt;/strong&gt;，第二次自举编译完成后，不再依赖libstdc++，转而依赖编译出来的libc++和libc++abi,但是仍然会依赖libgcc_s.so&lt;/li&gt;&#10;&lt;li&gt;多线程编译的时候时不时会出现奇怪的失败，所以默认改成单线程编译&lt;/li&gt;&#10;&lt;li&gt;修复编译完成后的提示输出&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="notice"&gt;NOTICE&lt;/h3&gt;&#10;&lt;p&gt;由于生成动态库会出现一些问题，所以目前都是采用llvm默认的静态链接的方式。但是静态链接生成的文件比较大，并且链接的东西很多，有可能会出现链接超时的错误。&#10;这时候可以通过手动cd到编译目录，执行 make &amp;amp;&amp;amp; make install 即可&lt;/p&gt;</description></item><item><title>Linux 和 Windows PowerShell 常用工具/命令 记录</title><link>//owent.net/2011/482.html</link><pubDate>Fri, 19 Aug 2011 11:16:55 +0000</pubDate><guid>//owent.net/2011/482.html</guid><description>&lt;h2 id="linux-常用工具"&gt;Linux 常用工具&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;enca: &lt;a href="http://dl.cihar.com/enca/"&gt;http://dl.cihar.com/enca/&lt;/a&gt;   文件名编码转换&lt;/li&gt;&#10;&lt;li&gt;iconv: 文件编码转换&lt;/li&gt;&#10;&lt;li&gt;convmv: 文件名编码转换&lt;/li&gt;&#10;&lt;li&gt;ldd: 查看可执行文件或动态链接库的依赖库&lt;/li&gt;&#10;&lt;li&gt;getconf: 查看配置信息（如getconf LONG_BIT可知当前系统是32位还是64位版本）&lt;/li&gt;&#10;&lt;li&gt;tcpdump: 监视网络服务&lt;/li&gt;&#10;&lt;li&gt;sync: 将缓冲区内容写入磁盘&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;echo 3 &amp;gt; /proc/sys/vm/drop_caches&lt;/code&gt;: 手动释放缓存&lt;/li&gt;&#10;&lt;li&gt;nm: 查看符号表&lt;/li&gt;&#10;&lt;li&gt;readelf: 查看ELF信息（Executable and Linkable Format）&lt;/li&gt;&#10;&lt;li&gt;man: 文档&lt;/li&gt;&#10;&lt;li&gt;top/htop: 查看最高占用&lt;/li&gt;&#10;&lt;li&gt;perf: 性能数据采集&lt;/li&gt;&#10;&lt;li&gt;sar: 系统信息采集&lt;/li&gt;&#10;&lt;li&gt;uptime: 系统1分钟、5分钟和15分钟的系统平均负载&lt;/li&gt;&#10;&lt;li&gt;free: 内存使用情况&lt;/li&gt;&#10;&lt;li&gt;iostat: 磁盘IO使用情况&lt;/li&gt;&#10;&lt;li&gt;pidstat: 查看进程状态&lt;/li&gt;&#10;&lt;li&gt;ipcs: 查看共享内存、消息、信号量信息，如：ipcs -m 共享内存&lt;/li&gt;&#10;&lt;li&gt;objdump –CS –l [bin文件]: 不反人类的反编译&lt;/li&gt;&#10;&lt;li&gt;strace: 系统调用跟踪&lt;/li&gt;&#10;&lt;li&gt;pstack: 查看当前调用栈&lt;/li&gt;&#10;&lt;li&gt;lsof： 查看打开的文件&lt;/li&gt;&#10;&lt;li&gt;ip addr: 查看ip地址&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;man [章节号] 手册名称:&lt;/p&gt;</description></item></channel></rss>