Skip to main content

3 posts tagged with "linux"

View All Tags

· 3 min read

命令行

  1. fish 一款 shell,自带了路径补全、强大的命令补全及建议。
    内置了历史命令补全(输入命令的一部分,会从历史纪录里面提示相匹配的命令,按上下键进行建议的命令的切换。)
    默认支持 git 的分支显示。

  2. exa 一款 ls 命令的替代品。支持丰富的颜色显示(例如文本文件、图片、压缩包等用不同颜色区分;文件的权限(wrx)也用不同颜色区分)。 默认显示容易阅读的形式(例如文件大小默认显示传统 ls -h 的形式)。 支持 git 文件的显示,标记文件的修改、暂存状态。 默认支持 tree 形式显示(类似 tree 命令)。 支持文件图标显示。 支持排序和筛选。 更多特性可查看:https://the.exa.website/features

  3. zellij 一款终端复用的工具。

  4. tokei 一块强大的代码行数统计与分析工具。支持按目录、语言等方式分类显示。支持排序、排除等操作。

  5. hexyl 一款二进制显示工具,拥有丰富的色彩显示。 另外,也推荐 vscode 的 Hex Editor 插件,图形化界面可能更方便。

  6. helix, 用 rust 开发的命令行的vim-like编辑器。

    • 熟悉 vim 的上手会比较快;
    • 开箱即用的 file-picker ,buffer-picker;
    • 支持 LSP(这样就可以实现代码补全、代码错误检查了)、支持 Multiple selections;
    • Space 模式和选项窗口提示很方便(各种按键导航和提示),用户体验不错。
  7. zellij,基于 rust 实现的终端复用工具(类似tmux)。

    • 导航和操作提示,注重用户体验。

· 10 min read

在linux上,最为受欢迎的 C/CXX 编译器之一就是 gcc 系列了,其使用 GNU 协议开源。 除此之外,还有基于llvm的现代编译器 clang/clang++,它则使用更为宽松的 BSD 协议开源。 关于两者的比较,可以参见这里

本文将尝试编译一套与 gnu 编译器无关的基于 clang 的工具链。 clang 是用C++写的,其依赖于 C 和 C++ 标准库,C++ ABI 库,以及 stack unwinder(实际上,我们编译其他的c/c++源代码也离不开三种)。
在clang编译器工具链中,我们可以采用 musl, libcxx, libc++abilibunwind 四个库来完成。 其中,libc++, libc++abi 和 libunwind 属于llvm 自己开发的 C++ 运行时(C++ runtime)。

clang系列编译器GNU 编译器
C标准库muslglibc
C++标准库libcxxlibstdc++
C++ ABI 库libc++abilibgcc(?不确定)
stack unwinderlibunwindlibgcc

需要指出的是,使用clang系列编译器时,也可以链接 GUN 的 glibc, libstdc++, libgcc 库, 这里我们为了与GNU无关,则把这个选择直接忽略。

这里插一句libcglibc的区别, 我们在编译程序时,使用ldd命令,可以看到二进制程序的链接库,而且大部分程序都会依赖于 libc。 在linux系统下,系统默认会有一个libc的库,大多数系统里面的这个libc库就是glibc,系统的大多数程序也都依赖于该库。
glibc是C标准库的一个实现,而在较早之前 linux 有自己的C标准库实现,后来改用使用glibc,而自己原先带libc库不再维护。

回到正题,C标准库,除了glibc的实现外,还有另一个开源实现 musl,采用 MIT 协议。 就C++标准库而言,llvm 也有一个实现,叫 libc++

libc++ is an implementation of the C++ standard library, targeting C++11, C++14 and above. All of the code in libc++ is dual licensed under the MIT license and the UIUC License (a BSD-like license).