首页 > 其他分享 >使用clion阅读任意交叉编译软件的代码

使用clion阅读任意交叉编译软件的代码

时间:2023-08-29 21:15:48浏览次数:38  
标签:gcc 交叉 neon 编译 vfpv4 clion arm openwrt

clion是linux下比较强大的C/C++ IDE,通过扩展也可以支持很多其他语言,例如shell,lua, perl, python,rust。唯一缺点是收费,但是相对它给我带来的便利,这点费用不算什么。我一般用来开发C/C++/项目,它支持3种方式解析工程源码,分别是

  • Makefile
  • CMake
  • 编译数据库

像代码的高亮,跳转,补全,都依赖对源码的解析,其实CMake和Makefile应该是一回事,CMake最终也会生成Makefile。首先通过make分析出工程里面用到哪些源文件,然后通过内置语法分析器解析得到符号表等信息,从而实现高亮,补全等。

当你的工程是针对你开发的PC时,这些都没问题,但是如果是交叉编译时,便会由于无法通过make来获取依赖的源文件,导致接下来的语法分析也无法进行。例如基于openwrt,buildroot开发时,或者编译uboot,kernel。因为这些构建框架都有自己特定的一些环境变量,编译脚本什么的,导致clion这种IDE无法简单的通过指定工具链来执行make,来分析依赖的源文件。于是编译数据库这种方式就派上了用场。cmake可以直接生成编译数据库,通过cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1,但是嵌入式开发里面用的一些库,工具可能是基于比较古老的版本,仅支持automake, makefile等。此时需要借助另一个工具bear,ubuntu20.04上直接apt安装即可,或者源码编译。bear的用法十分的简单

bear 编译命令
#例如,builrdroot中编译某个软件
bear make xl2tpd-{dirclean,build}
#或者,openwrt中
bear make package/xl2tpd/{clean,prepare,compile}

它的工作原理好像是创建子进程执行编译命令,然后监听工具链的gcc的调用,类似strace分析gcc的调用,知道gcc执行时,参数是怎么样的,open等系统调用又是怎么样的。最终生成编译数据库文件,其实就是个json文件。这个文件里面对每个gcc处理过的文件作了记录,包括3个值:

  • gcc的参数
  • 源文件名称
  • 源文件目录
{   
        "arguments": [
            "/home/a/workspace/exc-m620d/openwrt/staging_dir/toolchain-arm_cortex-a7+neon-vfpv4_gcc-5.4.0_musl-1.1.16_eabi/bin/arm-openwrt-linux-muslgnueabi-gcc",
            "-c",
            "-Os",
            "-pipe",
            "-mcpu=cortex-a7",
            "-mfpu=neon-vfpv4",
            "-fno-caller-saves",
            "-fno-plt",
            "-fhonour-copts",
            "-Wno-error=unused-but-set-variable",
            "-Wno-error=unused-result",
            "-mfloat-abi=hard",
            "-iremap/home/a/workspace/exc-m620d/openwrt/build_dir/target-arm_cortex-a7+neon-vfpv4_musl-1.1.16_eabi/xl2tpd-devel-20151125:xl2tpd-devel-20151125",
            "-Wformat",
            "-Werror=format-security",
            "-fstack-protector",
            "-D_FORTIFY_SOURCE=1",
            "-I/home/a/workspace/exc-m620d/openwrt/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl-1.1.16_eabi/usr/include",
            "-I/home/a/workspace/exc-m620d/openwrt/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl-1.1.16_eabi/include",
            "-I/home/a/workspace/exc-m620d/openwrt/staging_dir/toolchain-arm_cortex-a7+neon-vfpv4_gcc-5.4.0_musl-1.1.16_eabi/usr/include",
            "-I/home/a/workspace/exc-m620d/openwrt/staging_dir/toolchain-arm_cortex-a7+neon-vfpv4_gcc-5.4.0_musl-1.1.16_eabi/include/fortify",
            "-I/home/a/workspace/exc-m620d/openwrt/staging_dir/toolchain-arm_cortex-a7+neon-vfpv4_gcc-5.4.0_musl-1.1.16_eabi/include",
            "-DDEBUG_PPPD",
            "-DTRUST_PPPD_TO_DIE",
            "-fno-builtin",
            "-Wall",
            "-DSANITY",
            "-DLINUX",
            "-I./linux/include/",
            "-DUSE_KERNEL",
            "-DIP_ALLOCATION",
            "-o",
            "call.o",
            "call.c"
        ],
        "directory": "/home/a/workspace/exc-m620d/openwrt/build_dir/target-arm_cortex-a7+neon-vfpv4_musl-1.1.16_eabi/xl2tpd-devel-20151125",
        "file": "call.c"
    }

然后语法分析器就知道分析谁了。这样就可以愉快的使用clion阅读编辑跑在ARM上的代码了。不过有个地方需要注意,如果你的交叉编译工具链是通过export到环境变量的方式来执行的,那么编译数据库的的arguments的第一项,gcc就不会是一个绝对路径,导致clion解析异常,这时只要全局替换这个编译数据库文件里面的xxx-gcc为绝对路径即可。其实我认为这个应该是bear需要改进的一个地方,bear在填这个工具链的gcc时,通过realpath就知道工具链的绝对路径。

标签:gcc,交叉,neon,编译,vfpv4,clion,arm,openwrt
From: https://www.cnblogs.com/thammer/p/17665846.html

相关文章

  • Detours编译
    CMD进入Detours-master目录下nmake会报错 使用VS的本机工具命令提示符进入Detours-master目录下nmake  ......
  • 编译qt mqtt模块
    0. 环境 win10,qt6.3.11.下载源代码  mqtt:  https://github.com/qt/qtmqtt, 找到对应的tag,比如:6.3.1, 然后下载.zip文件。  perl:   https://strawberryperl.com, 选64位下载。2.安装perl,安装完,在环境变量里加上perl的bin目录。如果不加,有可能qt......
  • 编译wasm Web应用
    刚学完WebAssembly的入门课,卖弄一点入门知识。首先我们知道wasm是目标语言,是一种新的V-ISA标准,所以编写wasm应用,正常来说不会直接使用WAT可读文本格式,更不会用wasm字节码;而是使用其他高级语言编写源代码,经过编译后得到wasm应用。课程中使用了C++来编写源代码,所以这里我也用C++来......
  • JAVA编译准备
    1.JAVA语言特点1.Java语言是面向对象的(oop)2.Java语言是健壮的。Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证3.Java语言是跨平台性的。[一个编译好的.class文件可以在多个系统下运行]4.Java语言是解释型语言解释型语言:java、javascript、P......
  • python3.8以及更高版本 编译pcl
    github https://github.com/strawlab/python-pcl1.安装Cython当前的Cython的版本如下 由于python-pcl代码仓已经是很老的代码了,没有人在维护,高版本的Cython会导致编译失败报错如下Cython.Compiler.Errors.CompileError:pcl/_pcl_180.pyx 使用Cython==0.29版本即可解决......
  • Cygwin 编译 coTurn
    源码下载gitclone https://gitcode.net/mirrors/coturn/coturn.gitgitclonehttps://github.com/openssl/openssl.gitturnserver启动说明./turnserver-configfile=/opt/etc/turnserver.conf或者./turnserver-c/opt/etc/turnserver.confturnutils_uclient测试工具-e指定连......
  • cocos2dx 如何编译android 打包
    先要配置NDK,然后启动CMD命令进入到自己的游戏根目录,我的是starGame,所以如上所示:......
  • flink的源码编译方法
    1、下载flink源码2、修改整数限制numUnapprovedLicenses---改成100(在pom.xml文件)3、执行编译命令./mvnwcleanpackage-DskipTests4、如果只想名义子工程拷贝根目录的mvnw执行脚本到对应子目录,然后再执行./mvnwcleanpackage-DskipTests5、代码修改后编译,如果碰到chec......
  • 从原理聊 JVM(五):JVM 的编译过程和优化手段
    一、前端编译前端编译就是将Java源码文件编译成Class文件的过程,编译过程分为4步:1准备初始化插入式注解处理器(AnnotationProcessingTool)。2解析与填充符号表将源代码的字符流转变为标记(Token)集合,构造出抽象语法树(AST)。抽象语法树每个节点都代表着程序代码中的一个语法结......
  • IDEA设置JAVA使用的编译语言Language level为8
       设置这个为8不然每次pom文件修改都会变更为5pom.xml增加<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><java.version>8</java.version></properties>  增加插件配置<!--打包配置--&g......