• [交流分享] centos7.6下安装 7.3.0 版本gcc
    以下步骤请在root用户下执行。 步骤1     下载gcc-7.3.0.tar.gz,下载地址为https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz。 步骤2     安装gcc时候会占用大量临时空间,所以先执行下面的命令清空/tmp目录: sudo rm -rf /tmp/* 步骤3     安装依赖。     centos/bclinux执行如下命令安装。    yum install bzip2        ubuntu/debian执行如下命令安装。    apt-get install bzip2    步骤4     编译安装gcc。     1. 进入gcc-7.3.0.tar.gz源码包所在目录,解压源码包,命令为:     tar -zxvf gcc-7.3.0.tar.gz    2. 进入解压后的文件夹,执行如下命令下载gcc依赖包:     cd gcc-7.3.0 ./contrib/download_prerequisites     如果执行上述命令报错,需要执行如下命令在“gcc-7.3.0/”文件夹下下载依赖 包:     wget http://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2     wget http://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2     wget http://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gz     wget http://gcc.gnu.org/pub/gcc/infrastructure/isl-0.16.1.tar.bz2     下载好上述依赖包后,重新执行以下命令:     ./contrib/download_prerequisites     如果上述命令校验失败,需要确保依赖包为一次性下载成功,无重复下载现象。如有重复下载,请将原包删除     3. 执行配置、编译和安装命令:     ./configure --enable-languages=c,c++ --disable-multilib --with-system-zlib --prefix=/usr/local/gcc7.3.0     make -j15        # 通过grep -w processor /proc/cpuinfo|wc -l查看cpu数,示例为15,用户可自行设置相应参数。     make install        注意    其中“--prefix”参数用于指定gcc7.3.0安装路径,用户可自行配置,但注意不要配置为“/usr/local”及“/usr”,因为会与系统使用软件源默认安装的gcc相冲 突,导致系统原始gcc编译环境被破坏。示例指定为“/usr/local/gcc7.3.0”。步骤5     配置环境变量。     当用户执行训练时,需要用到gcc升级后的编译环境,因此要在训练脚本中配置环境变 量,通过如下命令配置。    export LD_LIBRARY_PATH=$ {install_path} /lib64 其中${install_path}为3.中配置的gcc7.3.0安装路径,本示例为“/usr/local/ gcc7.3.0/”。    说明    本步骤为用户在需要用到gcc升级后的编译环境时才配置环境变量。 ----结束
  • [技术干货] [LiteOS移植]目标芯片STM32F1 修改链接脚本
    上一章修改了Makefile,现在只需要修改一下链接脚本,大部分的移植工作就算做完了。什么是链接脚本?       链接脚本全称GNU-LD,供gcc工具链在链接阶段时调用,一个hex/bin/elf文件内有多个段,例如只读数据段、代码段、数据段、未初始化数据段等等,这些段在hex/bin/elf文件内的排放顺序取决于链接脚本,这里和大家说一STM32的例子,大家都知道在STM32的程序0地址开始为中断向量表,当发生中断时,程序会强制被硬件跳转到0x0+offset(中断的偏移地址)处,执行该处的指令,我们一般就直接将跳转到中断服务程序的汇编指令存放在0x0+offset(中断的偏移地址)处,这样中断就能得到处理,为了能确保跳转到中断服务程序的汇编指令一定在某个位置,所以我们需要使用链接脚本来控制链接。 GNU-LD 在线文档https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_mono/ld.html修改os.ld在targets\STM32F103RC\GCC目录下有一个os.ld链接脚本,这就是gcc工具链链接时所调用的,在“LiteOS_Lab Makefile分析”章节中向大家讲解过Makefile中如何控制gcc链接时调用os.ld文件。根据STM32F103Rx数据手册可知其Flash起始地址为0x0800 0000,大小为256KB;RAM起始地址为0x2000 0000,大小为48KB,如果不想查阅芯片手册也可以直接看之前我们通过STM32CubeMX生成的工程中的STM32F103RCTx_FLASH.ld得到以上数据。       首先修改第36行的esrack,这是栈顶地址,一般设置为RAM的结束地址,因为是满减栈,通过RAM大小加上RAM的起始地址得到,48KB*1024B=49152B转换为16进制得到0xC000,起始地址为0x2000 0000加上0xC000得到0x2000 C000;修改第33行的RAM大小为48K,Flash为256K,如果你移植的目标MCU不是我这个型号,请你按照前面所述方式进行修改,修改后如下图所示。       链接脚本其余地方均保持原有即可,到这里就修改完成了,下一节可以开始创建工程了。
  • [问题求助] arm gcc 能否被收录
    https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm外网下载好慢,好想国内镜像收录。
  • [问题求助] 安装Ascend-Toolkit-20.0.RC1-x86_64-linux_gcc7.3.0.run失败
    搭建Atlas 200 DK的新版(20.0.0)开发环境,在用ascend-sdk-manager安装Ascend-Toolkit-20.0.RC1-x86_64-linux_gcc7.3.0.run时报错。安装命令:# /home/HwHiAiUser/software/ascend-sdk-manager app install /home/HwHiAiUser/software/Ascend-Toolkit-20.0.RC1-x86_64-linux_gcc7.3.0.run dev --silent=y报错信息:package_short_name: toolkit, current_scene_support_package: ['toolkit']--------------------------------------------------# Failed to parse arguments: Unknown option -title--------------------------------------------------install /home/HwHiAiUser/software/Ascend-Toolkit-20.0.RC1-x86_64-linux_gcc7.3.0.run failed何解???
  • [安装] Ubuntu 20.04下从源代码编译r0.5版无法生成whl文件
    最近打算开始学习使用Mindspore,从官网上发现Mindspore要求使用Python3.7.5以上的版本,而我之前使用的Ubuntu18.04原生只支持到Python3.6.9,所以我就把体系升级到了Ubuntu20.04,Python也自动升级到Python3.8.2。但是在使用Pip进行安装时却显示“mindspore-0.5.0-cp37-cp37m-linux_x86_64.whl is not a supported wheel on this platform”:pip3 install https://ms-release.obs.cn-north-4.myhuaweicloud.com/0.5.0-beta/MindSpore/cpu/ubuntu_x86/mindspore-0.5.0-cp37-cp37m-linux_x86_64.whlDefaulting to user installation because normal site-packages is not writeable ERROR: mindspore-0.5.0-cp37-cp37m-linux_x86_64.whl is not a supported wheel on this platform.我觉得可能是ubuntu版本有问题,所以尝试从源代码进行安装。按照官网上的说明,先从Gitee上下载源代码:git clone https://gitee.com/mindspore/mindspore.git -b r0.5然后再进行编译:bash build.sh -e cpu -j4第一次编译报错,我看了一下系统默认的C/C++编译器是GCC 9,而官网上用的是GCC 7。于是我又把编译器改成GCC 7重新编译,这次没有报错,貌似编译成功了:... [100%] Built target _c_mindrecord [100%] Built target inference [100%] Built target _c_dataengine Run CPack packaging tool... CPack: Create package using External CPack: Install projects CPack: - Clean temporary : /home/isaac/Downloads/mindspore/build/package/mindspore CPack: - Run preinstall target for: MindSpore CPack: - Install project: MindSpore [] CPack: Create package -- Found Python3: /usr/bin/python3.8 (found suitable version "3.8.2", minimum required is "3.7") found components: Interpreter Development  -- Found Git: /usr/bin/git (found version "2.25.1")  Could not find 'Python 3.7' CPack: - package: /home/isaac/Downloads/mindspore/build/mindspore/mindspore generated. success to build mindspore project! ---------------- mindspore: build end   ----------------这里有有一个“Could not find 'Python 3.7'”的提示,不过最后还是显示“success to build mindspore project!”。按照官网上的说明,按说下一步应该是给生成的whl文件权限之后就可以安装了:chmod +x build/package/mindspore-{version}-cp37-cp37m-linux_{arch}.whl pip install build/package/mindspore-{version}-cp37-cp37m-linux_{arch}.whl可问题是,我发现我的build/package目录下面只有一个mindspore的文件夹,并没有这么一个whl文件,也就无法进行下一步操作。所以我想请问一下,如何才能生成whl文件从而进一步安装Mindspore?
  • [技术干货] 一键安装yum、gcc、cmake等常用工具
    下载附件,直接将附件拖到HiLens Kit的/tmp目录下解压执行install.sh脚本。install.sh脚本将会执行操作:安装yum并配置yum源通过yum安装python3-devel、openblas 、blas 、gcc-gfortran、libarchive-devel、cmake、gcc-c++、automake、autoconf、libtool、make配置ld的链接 ln -s /usr/bin/ld.bfd /usr/bin/ld使用cmake等工具需要export LD_LIBRARY_PATH=/usr/lib64/:$LD_LIBRARY_PATH(脚本里面已有)注意: 可以自行修改脚本,根据需要安装相应的库cmake等工具依赖库与/home/hilens/skillframework中的某些库有冲突,如果需要运行技能需要重新export LD_LIBRARY_PATH=/home/hilens/skillframewok/lib/,或者关闭当前session,重新打开一个窗口(否则运行技能可能会报错:找不到某些符号)更新:包里面的yum源好像不维护了,建议替换为华为开源镜像站的源(https://mirrors.huaweicloud.com/):[base]name=EulerOS-2.0SP8 basebaseurl=http://repo.huaweicloud.com/euler/2.8/os/aarch64/enabled=1gpgcheck=1gpgkey=http://repo.huaweicloud.com/euler/2.8/os/RPM-GPG-KEY-EulerOS步骤:1.先执行包里的installl.sh脚本,如果出现Failed to synchronize cache for repo 'base', ignoring this repo.  的问题,则说明是源的问题,可以看下日志vi /var/log/dnf.log。2.替换/etc/yum.repos.d/euleros_aarch64.repo里面的内容为上面的源,执行yum clean all清除原有yum缓存,执行yum makecache生成新的缓存。3.然后删除install.sh里面的InstallYum(避免重复安装yum导致/etc/yum.repos.d/euleros_aarch64.repo里面的内容被替换成之前的),再重新执行install.sh就可以正常安装了
  • [技术干货] Lite OS 中的__attribute__的实验程序
    在很多的系统内核中,时常会看到使用__attribute__的程序语句。在Lite OS中也有使用__attribute__的程序语句。这里提供一个简单的使用__attribute__实验程序。实验程序,使用了Lite OS 中 driver.h, driver.c, dev_test.c, uart_at.c中的部分代码,然后组合成的。分析实验程序,有助于理解Lite OS中的驱动程序的内容。程序是在树莓派3B+, 用gcc编译验证成功。1.程序代码test-attribute.h文件内容如下#include<stdio.h> #define OSDRIV_EXPORT(varname,drivname,operate,pridata,flagmask)      \     static const os_driv_para_t varname __attribute__((used,section("osdriv")))= \     {                           \         .name   = drivname,     \         .op     = operate,      \         .pri    = pridata,      \         .flag   = flagmask,      \     }      #define bool_t int #define false 0 #define true  1 /*  * Flag values for open(2) and fcntl(2)  * The kernel adds 1 to the open modes to turn it into some  * combination of FREAD and FWRITE.  */ #define O_RDONLY    0       /* +1 == FREAD */ #define O_WRONLY    1       /* +1 == FWRITE */ #define O_RDWR      2       /* +1 == FREAD|FWRITE */ #define uint32_t unsigned int typedef void* los_driv_t ;//returned by the driver register typedef bool_t (*fn_devopen)  (void *pri,int flag); typedef ssize_t (*fn_devread)  (void *pri,size_t offset,void *buf,size_t len,uint32_t timeout); typedef ssize_t (*fn_devwrite) (void *pri,size_t offset,const void *buf,size_t len,uint32_t timeout); typedef void   (*fn_devclose) (void *pri); typedef bool_t (*fn_devioctl) (void *pri,unsigned int cmd, void *para,int len); typedef bool_t (*fn_devinit)  (void *pri); typedef void   (*fn_devdeinit)(void *pri); typedef off_t  (*fn_devseek) (void *pri,off_t offset,int fromwhere); //all the member function of pri is inherited by the register function typedef struct {     fn_devopen    open;   //triggered by the application     fn_devread    read;   //triggered by the application     fn_devwrite   write;  //triggered by the application     fn_devclose   close;  //triggered by the application     fn_devioctl   ioctl;  //triggered by the application     fn_devseek    seek ;  //triggered by the application     fn_devinit    init;   //if first open,then will be called     fn_devdeinit  deinit; //if the last close, then will be called }los_driv_op_t; typedef struct {     const char            *name;      //device driver name     los_driv_op_t         *op;        //device operate functions     void                  *pri;       //private data,will be passed to op functions     uint32_t               flag;      //flags, like O_RDONLY O_WRONLY O_RDWR }os_driv_para_t;test-attribute.c文件代码如下#include<stdio.h> #include"test-attribute.h" //this file implement some demo to test the device module #define cn_testdriv_buf_len 256 typedef struct {     int refers; }testdriv_cb_test_t; static testdriv_cb_test_t s_testdriv_cb_test; //cached only one frame here static bool_t testdriv_open(void *pri,int flag) {     printf("TESTDRIV:PRI:0x%08X OPEN\n\r",(unsigned int)pri);     s_testdriv_cb_test.refers++;     return true; } static void testdriv_close(void *pri) {     printf("TESTDRIV:PRI:0x%08X CLOSE\n\r",(unsigned int)pri);     s_testdriv_cb_test.refers--;     return ; } static bool_t testdriv_write(void *pri,unsigned int offset,unsigned char *buf,int len,unsigned int timeout) {     printf("TESTDRIV:PRI:0x%08X WTRITE: buf:0x%08x len:%d timeout:%d\n\r",(unsigned int)pri,(unsigned int)buf,len,timeout);     return len; } static bool_t testdriv_read(void *pri,unsigned int offset,unsigned char *buf,int len,unsigned int timeout) {     printf("TESTDRIV:PRI:0x%08X READ: buf:0x%08x len:%d timeout:%d\n\r",(unsigned int)pri,(unsigned int)buf,len,timeout);     return len; } static bool_t testdriv_init(void *pri) {     printf("TESTDRIV:PRI:0x%08X INIT\n\r",(unsigned int)pri);     return true; } static void testdriv_deinit(void *pri) {     printf("TESTDRIV:PRI:0x%08X DEINIT\n\r",(unsigned int)pri);     return ; } static bool_t testdriv_ioctl(void *pri,unsigned int cmd, void *para,int paralen) {     printf("TESTDRIV:PRI:0x%08X IOCTL:cmd:%d para:0x%08x paralen:%d \n\r",(unsigned int)pri,cmd,(unsigned int)para,paralen);     return  true; } static const  los_driv_op_t  s_testdriv = {     .open = testdriv_open,     .close = testdriv_close,     .ioctl= testdriv_ioctl,     .read = testdriv_read,     .write = testdriv_write,     .init = testdriv_init,     .deinit = testdriv_deinit, }; OSDRIV_EXPORT(drivpara1,"dev1",(los_driv_op_t *)&s_testdriv,NULL,O_RDWR); OSDRIV_EXPORT(drivpara2,"dev1",(los_driv_op_t *)&s_testdriv,NULL,O_RDWR); OSDRIV_EXPORT(drivpara3,"dev2",(los_driv_op_t *)&s_testdriv,NULL,O_RDWR); OSDRIV_EXPORT(drivpara4,"dev3",(los_driv_op_t *)&s_testdriv,NULL,O_RDWR); OSDRIV_EXPORT(drivpara5,"dev2",(los_driv_op_t *)&s_testdriv,NULL,O_RDWR); OSDRIV_EXPORT(drivpara6,"dev1",(los_driv_op_t *)&s_testdriv,NULL,O_RDWR);test-attribute-main.c文件内容如下#include<stdio.h> #include"test-attribute.h" extern os_driv_para_t __start_osdriv,__stop_osdriv; int main() {     os_driv_para_t *para;     unsigned int num = 0;     unsigned int i = 0; /* #if defined (__CC_ARM)    //you could add other compiler like this     num = ((unsigned int)&osdriv$$Limit-(unsigned int)&osdriv$$Base)/sizeof(os_driv_para_t);     para = (os_driv_para_t *) &osdriv$$Base; #elif defined(__GNUC__)     para = (os_driv_para_t *)&__osdriv_start;     num = ((unsigned int )(uintptr_t)&__osdriv_end - (unsigned int)(uintptr_t)&__osdriv_start)/sizeof(os_driv_para_t); #endif */     para=&__start_osdriv;     for(i =0;i<3;i++)     {         printf("driver name:%s\n",para->name);         para->op->init(&i);         para->op->open(&i,O_RDWR);         para++;     }     return; }2.编译运行结果2.1使用gcc 编译过程如下gcc -c test-attribute.c -g -Wall -O2gcc -c test-attribute-main.c -g -Wall -O2gcc test-attribute.o test-attribute-main.o -o test-attribute2.2 然后给test-attribute权限设置    chmod +x test-attribute2.3 最后在系统中运行 ./test-attribute得到如下结果实验程序,或许可能会有不足之处,欢迎大家一起讨论分享,共同学习,共同进步。
  • [迁移工具] 泰山服务器安装gcc9.2.0
    安装gcc9.2.0时,没有成功,也没有有价值的报错信息,请教一下有没有什么技术点。
  • [技术干货] GCC工具链详解(下)
    总结:       gcc的参数:              -o 指定生成文件名              -E 只预处理,不编译,不汇编,不链接  文件名一般以.E结尾              -S 只编译,不汇编,不链接     文件名一般以.S结尾              -c 只编译(汇编),不链接       文件名一般以.o结尾        gcc工具链中的常用组件:              size:显示可执行文件或者二进制文件中各个段的大小,如下图:                            ar:用于处理库相关的指令,比如刚才提到的动态库,或者我们为了让程序保密,可以将自己写好的某个模块的代码制作库,只给别人一个头文件,库中都是二进制,无法看到源码,如果大家对制作库感兴趣,可以给我留言,改天专门说一说。              nm:列出一个二进制文件(可执行文件和库文件)中有哪些符号(函数和全局变量),实例如下图:                     as:该指令可以将汇编语言文件编译为二进制文件,其实就是gcc -c -o hello.o hello.S指令调用的工具示例如下图:              ld:链接器,就是将hello.o和动态库链接到一起的工具。              objdump:用于反汇编二进制文件为汇编代码的工具,使用示例如下图:       -D参数:反汇编所有段       >符号:因为objdump是直接打印输出信息,所以我们要把输出信息通过>重定向到hello.dis文件中方便查看。       我这里只截图main函数反汇编的代码块给大家看看:objdump工具在实际开发中作用挺大的,大家可以学习下,后面我还给出了一个利用objdump工具排错的案例。objcopy:该指令一般用于单片机的程序开发,当我们编译好了生成了一个elf文件,但是要求文件格式为hex或者bin才能进行烧录,我们这时就可以采用该指令进行转换,详细操作请参考:https://bbs.huaweicloud.com/forum/thread-58379-1-1.html  编译器优化导致错误的排错思路当程序出现错误时,我们怀疑是编译器的优化导致的错误,我们就可以去反汇编汇编后未链接的文件来看看。使用objdump,这里顺便说个小知识:为什么二进制文件永远无法还原为和原来的.c文件一模一样?就是因为编译器的优化导致的。什么是编译器的优化呢?比如我们执行如下语句,用于延时:       while(time)              ;特别聪明的编译器,就会认为这个语句没有用,自作主张地把这个语句删除了,导致我们的延时失效,如何解决呢?用volatile关键词修饰time,编译器就不敢帮我们优化这个语句了。再来举一个例子,比如我们定义一个指针,将GPIO的状态寄存器的地址赋值给该指针,我们去解析该指针指向地址处的内容时,就可以获取GPIO的状态,假设0为低电平、1为高电平,假设GPIO状态寄存器的地址为0x4000_0000,下面我用伪代码给大家展示:       LED_statr = *((char *)0x40000000)while(1)       {       if (LED_state)              printf(“LED ON\r\n”);       else              printf(“LED OFF\r\n”);}       编译时,如果编译器特别聪明,发现我们从0x4000_0000地址处读取数据特别慢,它就会把第一次读到的值写到一个局部变量中,获取LED_state时并不会从0x4000_0000地址去读,而是直接读取局部变量,所以无论LED的状态是什么LED_state永远是第一次获取到的值,这时我们可以用volatile去修饰,防止此类情况产生。
  • [技术干货] GCC工具链详解(上)
    摘要:GCC全称GNU Compiler Collection,是一套由 GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件。我们使用IoT Studio编译程序时,最终被调用的编译器也是GCC的一个分支,arm-none-eabi-工具链,注意这里所说的“链”,指一系列工具,编译器、汇编器、链接器等工具,被组装到了一起,形成了一个链子。本篇主要讲解他们的用法。 一个C文件到hex/bin文件的过程其实我们常说的“编译”一个程序,其中“编译“步骤包括了预处理、编译、汇编、链接等步骤,不过常见的IDE(Keil,IAR等)或者Makfile,为了方便用户的使用,将这些步骤封装起来了,我们只需点击“build”或者输入“make”,即可拿到烧录文件hex/bin,为了能提高大家在实际开发中的排错能力,我今天必须将这些知识都拿出来说一说。下面我就按照顺序“预处理à编译à汇编à链接à将elf文件转换为hex/bin文件”在Ubuntu系统下逐步向大家演示并讲解,我用gcc工具链替代arm-none-eabi-gcc工具链,因为ubuntu默认带有gcc工具链,如果你有兴趣可以跟着我做一做下面的实验从而加深理解和记忆。       首先创建两个文件:hello.c和hello.h。 预处理     预处理的作用就是将注释替换为空格和处理宏定义,你看到的#include,#ifndef,#define,#endif都是宏定义的标识符,这一步是将宏定义替换为编译器可以识别的符号,我们可以使用如下命令,让GCC工具链只进行预处理操作,将预后的数据生成到hello.E文件中:       gcc -E -o hello.E hello.c       我们现在可以来查看一下hello.E文件中的内容,我这里只截取最后15行的内容,因为前面的内容是#include <stdio.h>语句引入的内容,我们暂时不关心。              请注意第726行到732行,这是hello.h文件中的内容,被预处理器拷贝到了hello.c文件中,str的定义就有了。编译       编译是将预处理过的c语言文件编译为汇编语言的文件,等待汇编时转换为机器码,我使用如下指令来进行只编译不汇编不链接将汇编内容生成到hello.S文件中。       gcc -S -o hello.S hello.c       我们来查看一些hello.S文件中的内容:       汇编       将汇编代码汇编为二进制代码,这里的二进制代码并不能执行,因为还没有链接,没有运行时地址等等信息,所以无法运行,但是可以用于反汇编分析错误和问题。       我是用如下指令,让编译器只预处理、编译、汇编,不链接,将内容生成到hello.o文件中。       gcc -c -o hello.o hello.c       我们来看看文件中有些什么,注意:这里如果直接使用普通编辑器打开会出现乱码情况,如下图:       我这里有vim编辑器打开,首先使用vim -b hello.o以二进制形式打开该文件,在切换到“命令行模式”(按ESC并输入:),然后输入     %!xxd -g 1 切换为16进制,最终可以看到如下显示:              这是二进制数据和汇编指令一一对应(伪指令除外),最早的程序员就是直接编写这些二进制数据(纸上打孔),但是数字类的东西不便于人类处理,所以就有了“助记符”(汇编)来进行编程。       这里在引入一个小知识:如果你不知道当前文件是什么类型的文件,可以使用file指令查看:       我这里分别查看了.c C语言源文件,.S汇编语言文件,.o二进制待链接文件,hello可执行文件。链接       每个.c文件都会通过编译生成一个.o文件,最终的可执行文件由ld链接器根据链接脚本(没有指定链接脚本采用默认链接脚本)将多个.o文件和库文件(.so)链接并生成可执行文件。       使用如下指令即可完成链接操作,并将可执行文件名生成为hello。       gcc -o hello hello.o       这时,执行./hello,即可输出如下信息:              这里再说一个知识点:这样的链接叫做“动态链接”。       什么是动态链接?比如我们使用了printf函数,如果采用动态链接,printf函数的实现并未放到可执行文件中,而是等待执行hello可执行文件时(./hello),通过加载器去寻找printf所在的动态库并调用,从而输出。这样做的好处是可执行文件占用空间少,坏处是不便于移植,如果移植到没有支持printf函数动态库的机器上就无法运行了,所以单片机的程序都是采用静态链接。将elf文件转换为hex/bin文件       这里可以参考我的另外一篇帖子:https://bbs.huaweicloud.com/forum/thread-58379-1-1.html
  • [问题求助] Ubuntu最新镜像源apt-get找不到gcc-7安装包
    mirrors.tools.huawei.com/ubuntuapt-get install gcc-7 找不到安装包
  • [C/C++] GCC 9.1.0 9.3.0 编译失败,make报错
    【问题描述】在make编译GCC 9.1.0 和 9.3.0的时候,显示报错,错误信息如下:../.././libgfortran/intrinsics/random.c:317:7: error: implicit declaration of function 'getentropy' [-Werror=implicit-function-declaration]  317 |    if (getentropy (buf, buflen) == 0)         |ccl: some warnings being treated as errorsmake[3]: *** [random.lo] Error 1make[3]: Leaving directory '/opt/gcc-9.1.0/aarch64-unknown-linux-gnu/libgfortran'make[2]: *** [all] Error 2make[2]: Leaving directory '/opt/gcc-9.1.0/aarch64-unknown-linux-gnu/libgfortran'make[1]: Leaving directory '/opt/gcc-9.1.0'make: *** [all] Error 2【解决路径】找到报错的路径,可以看出报错的路径为'/opt/gcc-9.1.0/aarch64-unknown-linux-gnu/libgfortran'通过最新的报错信息可以看出,是编译时报的错,而且是与GCC相关,因为列出了编译选项 -Werror=implicit-function-declaration进入到报错的路径'/opt/gcc-9.1.0/aarch64-unknown-linux-gnu/libgfortran',发现目录下有Makefile,在这个Makefile中搜索到了 implicit  关键字。可以看出这是 AM_CFLAGS ,是一个编译参数,因此将这一段注释掉,重新复制这句话,并且将 -Werror=implicit-function-declaration 删除掉。之后重新 make,就可以顺利编译了。
  • [问题求助] 【求助】GCC构建LiteOS工程无法启动
    求助,本人使用GCC编译器编译LiteOS以后,LiteOS可以初始化,但是当其尝试跳转到主任务的时候就会跳转失败。本人使用的是GD32F303CE的芯片,芯片里面代码分两段,一段引导启动,一段启动起来执行LiteOS。第二段代码执行后,初始化均正常,在执行LOS_StartToRun函数中的BX R6的时候,发现R6是0,跳转就失败了。相同的工程使用IAR编译就正常,所以我怀疑我在写Makefile使用的ld文件有问题,ld文件是使用的别人发给我的demo。请各位大神帮我看看吧,我也不知道是哪里出了问题MEMORY{  FLASH (rx)      : ORIGIN = 0x08008000, LENGTH = 0x80000  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 0xFFFF}/* Define output sections */SECTIONS{  __stack_size = DEFINED(__stack_size) ? __stack_size : 0x1000;  __heap_size = DEFINED(__heap_size) ? __heap_size : 0x4000;    /* The startup code goes first into FLASH */  .isr_vector :  {    . = ALIGN(4);    KEEP(*(.isr_vector)) /* Startup code */    . = ALIGN(4);  } >FLASH  /* The program code and other data goes into FLASH */  .text :  {    . = ALIGN(4);    *(.text)           /* .text sections (code) */    *(.text*)          /* .text* sections (code) */    *(.rodata)         /* .rodata sections (constants, strings, etc.) */    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */    *(.glue_7)         /* glue arm to thumb code */    *(.glue_7t)        /* glue thumb to arm code */    KEEP (*(.init))    KEEP (*(.fini))    . = ALIGN(4);    _etext = .;        /* define a global symbols at end of code */  } >FLASH   .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH    .ARM : {    __exidx_start = .;      *(.ARM.exidx*)      __exidx_end = .;    } >FLASH  .ARM.attributes : { *(.ARM.attributes) } > FLASH  .preinit_array     :  {    PROVIDE_HIDDEN (__preinit_array_start = .);    KEEP (*(.preinit_array*))    PROVIDE_HIDDEN (__preinit_array_end = .);  } >FLASH  .init_array :  {    PROVIDE_HIDDEN (__init_array_start = .);    KEEP (*(SORT(.init_array.*)))    KEEP (*(.init_array*))    PROVIDE_HIDDEN (__init_array_end = .);  } >FLASH  .fini_array :  {    PROVIDE_HIDDEN (__fini_array_start = .);    KEEP (*(.fini_array*))    KEEP (*(SORT(.fini_array.*)))    PROVIDE_HIDDEN (__fini_array_end = .);  } >FLASH  /* used by the startup to initialize data */  _sidata = .;  /* Initialized data sections goes into RAM, load LMA copy after code */  .data : AT ( _sidata )  {    . = ALIGN(4);    _sdata = .;        /* create a global symbol at data start */    *(.data)           /* .data sections */    *(.data*)          /* .data* sections */    . = ALIGN(4);    _edata = .;        /* define a global symbol at data end */  } >RAM  /* Uninitialized data section */  . = ALIGN(4);  .bss :  {    /* This is used by the startup in order to initialize the .bss secion */    _sbss = .;         /* define a global symbol at bss start */    __bss_start__ = _sbss;    *(.bss)    *(.bss*)    *(COMMON)    . = ALIGN(4);    _ebss = .;         /* define a global symbol at bss end */    __bss_end__ = _ebss;  } >RAM  PROVIDE ( end = _ebss );  PROVIDE ( _end = _ebss );    .stack : ALIGN(8)  {    PROVIDE( _heap_end = . );     . = __stack_size;      PROVIDE( _estack = . );   }>RAM    .heap : ALIGN(0x10)  {PROVIDE( __LOS_HEAP_ADDR_START__ = . );. = __heap_size == 0 ? 0 : ORIGIN(RAM) + LENGTH(RAM);PROVIDE( __LOS_HEAP_ADDR_END__ = . );PROVIDE( _heap_end = . );  } >RAM  /* Remove information from the standard libraries */  /DISCARD/ :  {    libc.a ( * )    libm.a ( * )    libgcc.a ( * )  }}
  • [C/C++] 华为鲲鹏镜像gcc7.3.1安装文档错误
    centos7 docker容器中升级gcchttp://arm.cloud-onlinelab.cn/连接中gcc 7.3.1版本安装指导有个替换动态库的但是/usr/local/lib64/libstdc++.so.6.0.21文件不存在导致无法替换。/路径下find也未查找到该文件。
  • [技术干货] Kafka-2.11-1.1.0移植编译指导--中标麒麟7.5
    1简介Apache Kafka是一个开源流处理软件平台,用Scala和Java编写。该项目旨在提供统一、高吞吐量、低延迟的平台,用于处理实时数据馈送。它的存储层本质上是一个大规模可扩展设计为分布式事务日志的发布/订阅消息队列。官方链接:https://kafka.apache.org/类别:开源流处理平台语言:Scala/Java 2环境类别子项版本获取地址(方法) 硬件CPUKunpeng 920iBMC网络Ethernet-10GEiBMC存储SATA 4TiBMC内存xxG xxxMHziBMCOSNeoKylin7.5cat /etc/neokylin-releaseKernel4.14.0cat /proc/version 软件GCC4.8.5gcc -vOpenJDK 1.8.0_191参考下面安装说明Kafka2.11-1.1.0参考下面安装说明3依赖安装3.1安装OpenJDK下载并安装到指定目录(如/opt/tools/installed):wget https://github.com/AdoptOpenJDK/openjdk8-binaries/releases/download/jdk8u191-b12/OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gztar -zxf OpenJDK8U-jdk_aarch64_linux_hotspot_8u191b12.tar.gzmv jdk8u191-b12   /opt/tools/installed/【注】:使用系统自带Openjdk软件包可以通过执行“yum -y install java-1.8.0*”进行安装然后参考如下步骤配置JAVA_HOME环境变量;配置java环境变量,在/etc/profile文件末尾处增加下面的代码:JAVA_HOME=/opt/tools/installed/jdk8u191-b12PATH=$JAVA_HOME/bin:$PATHexport JAVA_HOME PATH运行下面命令,使修改的环境变量生效:source /etc/profile3.2安装GCC等依赖项挂载OS镜像:mount -o loop   /home/NeoKylin/nsV7Update5-adv-lic-build05-aarch64.iso /mnt/NeoKylin/修改/etc/yum.repos.d/ns7-adv.repo文件,配置yum本地源:[ns7-adv-os]name=NeoKylin Linux Advanced Server 7 - Osbaseurl= file:///mnt/NeoKylingpgcheck=0gpgkey=file:///mnt/NeoKylin/RPM-GPG-KEY-neokylin-releaseenabled=1        运行下面的命令,使yum源配置生效:yum clean allyum makecacheyum安装GCC等相关依赖:sudo yum install -y snappy snappy-devel autoconf automake libtool   git gcc gcc-c++ make cmake openssl openssl-devel ncurses-devel zlib   zlib-devel bzip2 bzip2-devel bzip2-libs readline readline-devel bison zip   unzip tar tcl3.3安装gradle编译软件1、下载grade开源软件包wget   https://downloads.gradle.org/distributions/gradle-5.4.1-bin.zip2、解压gradle-5.4.1-bin.zipunzip gradle-5.4.1-bin.zip3、进入解压路径cd gradle-5.4.1/        4、将GRADLE_HOME配置到/etc/profile环境变量中vi /etc/proflile5、使GRADLE_HOME环境变量生效source /etc/proflile 3.4安装编译gradle-scoverage1、下载gradle-scoverage开源软件包wget   https://github.com/scoverage/gradle-scoverage/archive/3.1.3.tar.gz2、解压3.1.3.tar.gztar zxvf 3.1.3.tar.gz3、进入解压路径cd gradle-scoverage-3.1.3/        4、使用gradle编译gradle-scoverage-3.1.3gradle assemble 3.5安装编译shadow1、下载shadow开源软件包wget https://github.com/johnrengelman/shadow/archive/5.0.0.tar.gz2、解压5.0.0.tar.gztar zxvf 5.0.0.tar.gz3、进入解压路径cd shadow-5.0.0/        4、使用gradle编译shadow-5.0.0gradle assemble 3.6安装scala软件1、下载scala安装软件包wget   https://downloads.lightbend.com/scala/2.11.11/scala-2.11.11.tgz2、解压scala-2.11.11.tgztar zxvf scala-2.11.11.tgz -d /usr/local3、将SCALA_HOME配置到/etc/profile环境变量中vi /etc/proflile增加如下内容export   SCALA_HOME=/usr/local/scla-2.11.11export PATH=$PATH:$SCALA_HOME/bin5、使SCALA_HOME环境变量生效source /etc/proflile 3.7对gcc、g++和c++增加-fsigned-char选项1、对gcc增加-fsigned-char选项1)使用which gcc命令寻找gcc所在路径(一般位于/usr/bin/gcc)which gcc2)、更改gcc的名字(比如改成gcc-arm)mv /usr/bin/gcc   /usr/bin/gcc-arm3)、进入gcc所在目录执行vi gcc,并填入如下内容保存:#! /bin/sh /usr/bin/gcc-arm -fsigned-char "$@"cd /usr/bin/vi gcc4)、执行chmod +x gcc给脚本添加执行权限chmod +x gcc2、对g++增加-fsigned-char选项1)使用which g++命令寻找g++所在路径(一般位于/usr/bin/g++)which g++2)、更改g++的名字(比如改成g++-arm)mv /usr/bin/g++   /usr/bin/g++-arm3)、进入g++所在目录执行vi g++,并填入如下内容保存:#! /bin/sh /usr/bin/g++-arm -fsigned-char "$@"cd /usr/bin/vi g++4)、执行chmod +x g++给脚本添加执行权限chmod +x g++3、对c++增加-fsigned-char选项1)使用which c++命令寻找g++所在路径(一般位于/usr/bin/c++)which c++2)、更改c++的名字(比如改成c++-arm)mv /usr/bin/c++   /usr/bin/c++-arm3)、进入c++所在目录执行vi c++,并填入如下内容保存:#! /bin/sh /usr/bin/c++-arm -fsigned-char "$@"cd /usr/bin/vi c++4)、执行chmod +x c++给脚本添加执行权限chmod +x c++ 4移植分析使用checkSo工具(获取地址:https://bbs.huaweicloud.com/forum/thread-22679-1-1.html)检查Kafka-2.11-1.1.0对应x86的安装包(kafka_2.11-1.1.0.tgz)或源码包是否有依赖x86的so文件,通过检查Kafka-2.11-1.1.0对应x86安装包发现有依赖的“librocksdbjni32.so,rocksdbjni-5.7.3.jar”、“librocksdbjni64.so,rocksdbjni-5.7.3.jar”和“librocksdbjnile.so,rocksdbjni-5.7.3.jar”:需要先编译rocksdbjni-5.7.3.jar使其中包含的librocksdbjni32.so、librocksdbjni64.so和librocksdbjnile.so使能arm,编译过程见 “5 依赖库编译”。5依赖库编译1、编译rocksdbjni-5.7.3.jar1)下载源码并解压wget   https://codeload.github.com/facebook/rocksdb/zip/v5.7.3mv   v5.7.3 rocksdbjni-5.7.3.zipunzip   rocksdbjni-5.7.3.zip2)、进入解压目录cd rocksdb-5.7.3/        3)、修改Makefile将DEBUG_LEVEL设为0,并添加-fsigned-char选项4)、编译rocksdbjavaPORTABLE=1   make rocksdbjava -j8        5)、进入编译结果路径cd   java/target/6)、重命名rocksdbjni-5.7.3-linux64.jar并将其拷贝到本地gradle仓cp   rocksdbjni-5.7.3-linux64.jar rocksdbjni-5.7.3.jarcp rocksdbjni-5.7.3.jar   /gradleRepository/caches/modules-2/files-2.1/org.rocksdb/rocksdbjni/5.7.3/421b44ad957a2b6cce5adedc204db551831b553d/ 6编译安装1、从github网站下载源码并解压wget   https://archive.apache.org/dist/kafka/1.1.0/kafka-1.1.0-src.tgztar   zxvf kafka-1.1.0-src.tgz2、进入解压目录cd   kafka-1.1.0-src/        3、修改build.gradlevi build.gradle把gradle-scoverage、shadow的版本修改成当前使用的版本,注释红框内注释行,并添加    classpath   'org.scoverage:gradle-scoverage:3.1.3'    classpath   'com.github.jengelman.gradle.plugins:shadow:5.0.0'4、执行gradle -g /$UserHome/gradleRepository cleangradle   -g /$UserHome/gradleRepository clean5、执行gradle -g /$UserHome/gradleRepository releaseTarGz -infogradle   -g /$UserHome/gradleRepository releaseTarGz -info6、查看编译的文件cd   core/build/distributions/ 7验证1、编译验证使用checkSo工具(获取地址:https://bbs.huaweicloud.com/forum/thread-22679-1-1.html)检查编译后的kafka_2.11-1.1.0.tgz是否不再含有依赖的x86架构的so文件,检查方法参考工具中的 《CheckSo使用说明.docx》,如果还有依赖的x86架构的so文件,则需要继续完成对应jar包的编译,直到无依赖的x86架构的so文件后,再次编译该组件并通过checkSo工具检查确认,编译后的组件包不再有依赖的x86架构的so文件则表明编译成功。2、功能验证参考https://www.huaweicloud.com/kunpeng/software/kafka.html8参考信息1、https://www.huaweicloud.com/kunpeng/software/kafka.html2、http://kafka.apache.org/ 9FAQ暂无。【来自转载https://bbs.huaweicloud.com/forum/thread-41082-1-1.html】