在 Linux 下使用 clang 3.0 + llvm 3.0 + libc++

什么是 clang/llvm/libc++
先说一下背景,以防有些同学对 clang/llvm/libc++ 是什么还没有概念:

clang 是最近几年(在大财主苹果的支持下)发展得非常好的 C 家族语言 (包括C/C++/Obj-C/Obj-C++) 编译器前端,所谓前端,就是它可以认识 C/C++/Obj-C/ObjC++ 代码,并且把它转化成某种更接近机器指令的形式。理论上说,“某种形式”是语法树,但作为一个工具,clang 实际上会帮助你调用链接器生成可执行代码,这跟 gcc 是一样的。

llvm 是一个通用的编译优化和代码生成平台,它定义了一个中间语言 LLVM IR,只要前端把代码编译成 LLVM IR,就可以使用 llvm 丰富的优化模块和代码生成模块。换句话说,llvm 让“创造一种计算机语言”变成了一个相对容易的事情,这件事情会有深远的影响。

libc++ 是针对 clang 特别重写的 C++ 标准库,也算是 clang 的“御用”库了。这就像 libstdc++ 和 gcc 的关系,但 clang 也可以用 libstdc++,这是本文的主题之一。

使用预编译的 clang
新鲜出炉的 clang/llvm 3.0 可以在这里下载,它提供了 Debian/FreeBSD9/MacOS X/Ubuntu 11.04, 11.10 的预编译二进制文件。假设你用的和我一样是版本足够的 Ubuntu ,那就只需要下载相应文件,展开,然后把文件拷到 /usr/local 底下就好了。例如下载的是 clang+llvm-3.0-i386-linux-Ubuntu-11_10.tar.gz ,则

tar xvf clang+llvm-3.0-i386-linux-Ubuntu-11_10.tar.gz
cd clang+llvm-3.0-i386-linux-Ubuntu-11_10
sudo cp -r * /usr/local

事实上这样就可以用了,即便没有 libcxx 也没关系,clang 可以使用 libstdc++ 。譬如一个经典的 hello.c (内容就不必多说了),用

clang hello.c
./a.out

应该就可以看到结果。

加上 libc++
如果想要用 libc++ ,需要拿下它的代码,自己编译,不过非常容易。首先保证你有 subversion:

sudo apt-get install subversion

然后从 libc++ 代码仓库下载代码:

svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx

随后进入目录 libcxx 并编译

cd libcxx/lib
./buildit

编译没问题的话,会在 lib 目录下生成一个 libc++.so.1.0 文件,把它拷贝到 /usr/lib,并加上两个符号链接:

sudo cp ./libc++.so.1.0 /usr/lib
cd /usr/lib
sudo ln -sf libc++.so libc++.so.1.0
sudo ln -sf libc++.so.1 libc++.so.1.0

然后,由于 clang 认为 libc++ 头文件位于 /usr/include/c++/v1 底下,只需要把 libcxx/include 这个目录链接到该处就好了,换句话说,如果你

ls /usr/include/c++/v1

看到熟悉的 C++ 标准库头文件们,那就对了。

使用 clang++/libc++
clang 3.0 支持几个连 gcc 4.6 都没支持的 C++11 特性,比如初始化非静态类成员,看看下面的代码 (new_feature.cpp):

复制代码
1 #include
2 #include
3
4 class MyClass
5 {
6 public:
7 std::string s = “Hello, world\n”; // Non-static data member initializer
8 };
9
10 int main()
11 {
12 std::cout << MyClass().s;
13 }
复制代码
第7行直接在类声明处初始化一个 std::string 成员,这是原本只在 Java/C# 里面才能做的事情,如今终于飞入 C++ 程序中。编译命令:

clang++ --std=c++0x -stdlib=libc++ new_feature.cpp
./a.out

输出熟悉的

Hello, world

我们的 clang 就算正式能用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Kali中使用Clang是完全可行的。 Clang完全支持交叉编译作为其设计的固有部分,具体取决于您的Clang版本的配置方式,它可能支持许多交叉编译器,也可能仅支持本机目标。您可以使用"-target <architecture>"选项来指定要为其构建的体系结构。如果需要了解给定目标支持的处理器列表,可以使用"--print-supported-cpus"选项来打印出来。此外,您还可以使用"-march=<cpu>"选项来指定Clang应该为特定处理器家族成员和更高版本生成代码。所以,使用Clang来编译代码是一种可行的选择。 关于Clang的诊断选项,它们可以控制Clang打印诊断信息(如错误和警告)的方式。例如,"-fshow-column"选项可以显示列号,"-fshow-source-location"选项可以显示源代码位置,"-fcaret-diagnostics"选项可以以插入符号形式显示诊断信息等。详细信息可以在Clang用户手册中找到。 至于aes-finder,它是一个在运行时用于查找AES密钥的实用程序。它可以在运行进程内存中查找128、192和256位的AES密钥。您可以在Visual Studio 2013中打开aes-finder.sln解决方案,或者使用gcc/clang编译器来使用它。 总结起来,Kali可以使用Clang进行编译,并且您可以通过设置目标体系结构和使用适当的选项来自定义编译过程。另外,您还可以使用aes-finder实用程序来查找AES密钥。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [最新kali之clang](https://blog.csdn.net/qq_40399982/article/details/112328869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [aes-finder, 在运行过程中,用于查找AES密钥的实用程序.zip](https://download.csdn.net/download/weixin_38744270/11770394)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值