编译llvm+clang,使用libclang分析C++代码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

使用libclang分析C++代码,得到AST,根据节点遍历,获取所需的特定结构体内容。


一、准备工作

libclang是在clang编译后的附带产物。clang后续版本中使用了c++11等新的特性。所以要求gcc版本至大于4.8,为了不改变机器环境,编译选择安装到当前路径下。
1.升级gcc版本至稳定的7.5,通过源码安装的方式,步骤如下

  • 解压:tar -xvf xxx.tar.gz
  • 创建文件夹:mkdir build
  • 下载依赖文件:./contrib/download_prerequisites
    (也可手动下载wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz
    wget http://www.mpfr.org/mpfr-current/mpfr-3.1.6.tar.gz
    wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz)
  • 配置Makefile:./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib --prefix=/data/gcc-7.5.0/gcc750
  • 编译:make -j4
  • 安装:make install
  • 注:使用新的GCC编译代码时,会提示GLIBCXX符号找不到,原因是lib64中的glibc++.so.6的版本和当前使用gcc版本不一致,修改时有两种方式,方式一:直接将新的gcc,libstdc++等库通过软连接方式替换现有,但这会改变生产环境,会对已经运行的程序产生影响;方式二:临时改变环境变量,退出后下无效,使用export LD_LIBRARY_PATH=/data/gcc750/lib64 让系统优先从该目录下寻找库。

2.升级cmake,现在linux二进制cmake-3.14.7-Linux-x86_64.tar.gz,解压后直接使用,通过软连接命令:ln -s /data/cdduan/cmake-3.14.7-Linux-x86_64/bin/cmake /bin/cmake

3.升级python版本,编译llvm需要python3版本,选择使用稳定的3.7.5版本,

  • 配置Makefile:./configure --prefix=安装路径,这里建议安装在/usr/local/python3,如果担心污染环境,可将prefix路径选择本地。
  • 编译之前请确认是否安装安装 readline 相关模块。
    readline 是 bash shell 用的库,包含许多使用功能,例如:命令行自动补全。如果没有安装,请执行:yum -y install readline readline-devel
  • 编译:make
  • 安装:make install
  • 注:如果安装出现异常ModuleNotFoundError: No module named ‘_ctypes’,不要慌,这是因为在安装Python3.7以上版本时,需要一个新的libffi-devel包做依赖,执行命令安装:yum -y install libffi-devel

二、编译llvm+clang

clang貌似无法单独通过编译,需要依赖llvm的编译具体构建顺序参考官网
官网构建指导

  • 现在llvm工程,我使用的是11.1.0版本
  • 解压:unzip xxxx.zip
  • 进入文件夹,创建构建文件夹:mkdir build &&cd build
  • 配置makefile:cmake -DCMAKE_CXX_COMPILER=/data/cdduan/gcc-7.5.0/gcc750/bin/g++ -DCMAKE_C_COMPILER=/data/cdduan/gcc-7.5.0/gcc750/bin/gcc -DLLVM_ENABLE_PROJECTS=clang -G"Unix Makefiles" ../llvm/ (-DLLVM_ENABLE_PROJECTS=clang作用是编译clang,如果不添加,默认只编译llvm工具,不产生clang,libclang.so等工具)
  • 编译:make -j4
  • 安装:make install
    在build目录下出现bin、lib等文件夹,找到需要的libclang.so

三、使用libclang分析c++代码

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值