-
在很多的系统内核中,时常会看到使用__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时,没有成功,也没有有价值的报错信息,请教一下有没有什么技术点。
-
总结: 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全称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
-
mirrors.tools.huawei.com/ubuntuapt-get install gcc-7 找不到安装包
-
【问题描述】在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以后,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 ( * ) }}
-
centos7 docker容器中升级gcchttp://arm.cloud-onlinelab.cn/连接中gcc 7.3.1版本安装指导有个替换动态库的但是/usr/local/lib64/libstdc++.so.6.0.21文件不存在导致无法替换。/路径下find也未查找到该文件。
-
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】
-
https://bbs.huaweicloud.com/forum/thread-50175-1-1.html帖子拦截是什么原因?
-
1 GCC简介GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。1985年由理查德·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。原名为GNU C语言编译器(GNU C Compiler),因为它原本只能处理C语言。GCC在发布后很快地得到扩展,变得可处理C++。之后也变得可处理Fortran、Pascal、Objective-C、Java、Ada,Go与其他语言。许多操作系统,包括许多类Unix系统,如Linux及BSD家族都采用GCC作为标准编译器。 2 配置编译环境2.1 安装依赖yum install bzip2 -y yum install gcc gcc-c++ -y ----结束3 编译依赖库3.1 编译gmp 6.1.2gmp下载链接:http://ftp.gnu.org/gnu/gmp/安装gmpwget https://ftp.gnu.org/gnu/gmp/gmp-6.1.2.tar.bz2tar -jxf gmp-6.1.2.tar.bz2cd gmp-6.1.2./configure --prefix=/usr/local/gmp-6.1.2make -j4make install3.2 编译mpfr 4.0.2mpfr下载链接:https://ftp.gnu.org/gnu/mpfr/安装mpfrwget https://ftp.gnu.org/gnu/mpfr/mpfr-4.0.2.tar.gztar -zxf mpfr-4.0.2.tar.gzcd mpfr-4.0.2./configure --prefix=/usr/local/mpfr-4.0.2 --with-gmp=/usr/local/gmp-6.1.2makemake install3.3 编译mpc 1.1.0mpc下载链接:https://ftp.gnu.org/gnu/mpc/安装mpcwget https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gztar -zxf mpc-1.1.0.tar.gzcd mpc-1.1.0./configure --prefix=/usr/local/mpc-1.1.0 --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-4.0.2makemake install 4 编译GCC 9.1.0 步骤 1 设置环境变量:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-1.1.0/lib:/usr/local/gmp-6.1.2/lib:/usr/local/mpfr-4.0.2/lib 步骤 2 下载源码编译:wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-9.1.0/gcc-9.1.0.tar.gztar -xzf gcc-9.1.0.tar.gzcd gcc-9.1.0./configure --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-4.0.2 --with-mpc=/usr/local/mpc-1.1.0 --prefix=/usr/local/gcc-9.1.0make -j64make install 步骤 3 确认版本生效:gcc -v ----结束 5 参考更多信息请参见GCC官网:https://gcc.gnu.org/。
-
概述当前ISV应用所依赖的编译工具、开发工具,第三方中间件和软件等,大多都是基于X86提供。第三方开源软件工具等开发语言大致分为两类:编译型语言:典型的如C/C++/Go语言,都属于编译型语言。编译型语言开发的程序在从x86处理器迁移到鲲鹏处理器时,必须经过重新编译才能运行。解释型语言:典型的如Java/Python语言,都属于解释型语言,解释型语言开发的程序在迁移到鲲鹏处理器时,一般不需要重新编译。解释型语言的源代码由编译器生成字节码,然后再由虚拟机解释执行。比如基于java的,只需要平台安装了jvm即可。 本文档主要描述基于编译型语言C/C++的第三方开源软件使用aarch64-linux-gcc编译器编译出针对鲲鹏arm64平台的可执行代码过程中常见问题汇总。 1 编译过程1.1 本地gcc编译1.1.1 编译过程介绍 一、基本信息 1、./configure 是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。 2、make 是用来编译的,它从Makefile中读取指令,然后编译。3、make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。二、详细解释1、configure命令这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:./configure --prefix=/usr 意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定 --sys-config= 参数进行设定。有一些软件还可以加上 –with --enable、--without、--disable 等等参数对编译加以控制,你可以通过允许 ./configure --help 察看详细的说明帮助。2、make这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。如果 在 make 过程中出现 error ,或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。可能遇到的错误:make *** 没有指明目标并且找不到 makefile。问题很明了,没有Makefile,怎么办,原来是要先./configure 一下,再make。3、make insatll这条命令来进行安装(当然有些软件需要先运行 make check 或 make test 来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)。4、说明在Linux下编译安装一个应用程序时,一般先运行脚本configure,然后用make来编译源程序,在运行make install,最后运行make clean删除一些临时文件。运行configure脚本,就可以生成Makefile文件,然后就可以运行make、make install和make clean。configure是一个shell脚本,它可以自动设定源程序以符合各种不同平台上Unix系统的特性,并且根据系统叁数及环境产生合适的Makefile文件或是C的头文件(header file),让源程序可以很方便地在这些不同的平台上被编译连接。到此时,就可以运行make进行编译,在运行make install进行安装了,最后运行make clean删除临时文件。$ make$ make install (注:运行这个要有足够的权限)$ make clean利用configure所产生的Makefile文件有几个预设的目标可供使用,其中几个重要的简述如下:make all:产生我们设定的目标,即此范例中的可执行文件。只打make也可以,此时会开始编译原始码,然后连结,并且产生可执行文件。make clean:清除编译产生的可执行文件及目标文件(object file,*.o)。make distclean:除了清除可执行文件和目标文件外,把configure所产生的Makefile也清除掉。make install:将程序安装至系统中。如果原始码编译无误,且执行结果正确,便可以把程序安装至系统预设的可执行文件存放路径。如果用bin_PROGRAMS宏的话,程序会被安装至/usr/local/bin这个目录。make dist:将程序和相关的档案包装成一个压缩文件以供发布。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的文件。 PACKAGE和VERSION这两个变数是根据configure.in文件中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义。在此范例中会产生test-1.0.tar.gz的档案。make distcheck:和make dist类似,但是加入检查包装后的压缩文件是否正常。这个目标除了把程序和相关文件包装成tar.gz文件外,还会自动把这个压缩文件解开,执行 configure,并且进行make all 的动作,确认编译无误后,会显示这个tar.gz文件可供发布了。这个检查非常有用,检查过关的包,基本上可以给任何一个具备GNU开发环境-的人去重新编译make –j [N]:make是编译的执行,指定此参数使用多核CPU并行编译的方式加快编译速度,可以使用cpu核数的一倍指定此参数值,CPU核数获取命令[cat /proc/cpuinfo | grep "processor" | wc -l],比如获取到的核数为16 ,可以指定编译参数:make -j 161.1.2 使用GCC编译应用I. 环境准备编译安装可能会依赖一些其他软件或者库等,我们需要提前配置好yum源,如果编译环境不能连公网的情况下,需要配置本地yum源;本地yum源配置上传操作系统ISO文件至编译环境,测试使用CentOS 7.5 aarch64版本环境,上传 CentOS-7-aarch64-Everything-1804.iso至操作系统/opt目录下mount /opt/CentOS-7-aarch64-Everything-1804.iso /media/ -o loop修改yum配置文件mv /etc/yum.repos.d /etc/yum.repos.d.bakmkdir /etc/yum.repos.dtouch /etc/yum.repos.d/local.repochmod 644 /etc/yum.repos.d/local.repoecho "[base-local]" >> /etc/yum.repos.d/local.repoecho "name=$name" >> /etc/yum.repos.d/local.repoecho "baseurl=file:///media" >> /etc/yum.repos.d/local.repoecho "enabled=1" >> /etc/yum.repos.d/local.repoecho "gpgcheck=0" >> /etc/yum.repos.d/local.repoyum clean allyum makecacheII. 下载源码包下载源码包xx_src_3.6.tar.gz上传至/opt目录,然后解压源码包tar –zxvf xx_src_3.6.tar.gz进入到解压目录。III. 生成makefile执行./configure,检查环境并生成makefile。常见问题:■有些源码文件默认不带configure文件,应该参考软件官网具体的配置步骤,常见处理方法如:1、目录下是否有autogen文件,可以执行./autogen.sh生成configure文件。2、使用cmake –G “Unix Makefies” 生成Makefile文件。■根据错误提示,确认软件缺少的一些依赖。如:【The C compiler identification is unknown.】,系统缺少gcc;【configure: error: --with-readline=yes (default) and headers/libs are not available】系统缺少readline。需要先安装这些依赖如:yum install –y gcc gcc-c++yum install -y readline-devel■无法猜测构建类型,有些包默认并不支持aarch64的系统,需要指定参数,或者修改config.guess文件方式,如:1、./configure –build=aarch64-linux2、修改源码中config.guess,添加如下代码(视具体情况,可以查看此文件,对于alpha,amd64,x86_64的设置参考修改) aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;;IV. 编译安装执行make –j 16make install完成编译安装。2 编译常见问题2.1 The C compiler identification is unknown.问题现象: The C compiler identification is unknown. The CXX compiler identification is unknown.解决方案:缺少交叉编译软件解决办法: yum install gcc gcc-c++2.2 cannot remove 'libtoolT'问题解决问题现象:在使用./configure && make && make install 的时候,报错不能移除libtoolT,因为系统没有安装libtool 解决方案:安装libtool后重新编译操作步骤:yum install libtool -y2.3 yum-config-manager: command not found问题解决问题现象:yum-config-manager: command not found解决方案:系统没有安装yum附加工具包,安装yum附加工具包操作步骤:yum -y install yum-utils2.4 启动运行默认缓存不足问题解决问题现象:nginx: [crit] ngx_slab_alloc() failed: no memory nginx: [emerg] http upstream check_shm_size is too small, you should specify a larger size.问题原因:检查后端服务器健康检查状态配置太多,导致默认缓存1M不够用。解决方案:增加默认缓存操作步骤:在“nginx.conf”的http块中增加一条配置,设置缓存大小,check_shm_size 50m2.5 执行编译时找不到configure文件问题解决问题现象: 执行编译时找不到configure文件,./configure 无效解决方案:如果目录下有autogen.sh文件,则使用此文件产生configure文件操作步骤: 使用./ autogen.sh执行该脚本解决方案:如果目录下无autogen.sh文件,采用cmake -G "Unix Makefiles"命令,生成标准的UNIX makefile操作步骤: 执行命令cmake -G "Unix Makefiles"2.6 无法猜测构建类型问题解决问题现象: Configure:error:cannot guess build type; you must specify one解决方案:在configure执行时指定构建类型操作步骤: 1、在./configure时加入 “--build=arm-linux --host=arm-linux”即可解决。如./configure --build=arm-linux --host=arm-linux2、修改config.guess或者gnu-os文件方式,添加如下代码(视具体情况,可以查看此文件,对于alpha,amd64,x86_64的设置参考修改) aarch64:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;;2.7 文件句柄配置过小问题解决问题现象: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]解决方案: 修改系统当前支持的文件句柄为65536(系统默认为65535,可用ulimit -n查询,elasticsearch要求最低为65536)操作步骤: 1. 编辑/etc/security/limits.conf,追加以下内容: * soft nofile 65536 * hard nofile 65536 2. 修改参数,保存后重启云服务器生效2.8 内存映射大小配置问题解决问题现象:max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]解决方案:修改单进程最多可用于内存映射区大小为262145(elasticsearch要求最小为262144)。操作步骤: 1. 编辑 /etc/sysctl.conf,追加以下内容:vm.max_map_count=2621452. 保存后,执行:sysctl –p2.9 configure: error: --with-readline=yes (default) and headers/libs are not available问题现象:有明显报错信息有报错解决方案:有些参数默认会报错,但去掉对编译没有影响,可以去掉后试一下解决办法:1.configure的带参数配置:./configure --with-readline=no2.提前安装,或者centos系统:安装readline:yum install readline-devel2.10 configure: error: --with-x=yes (default) and X11 headers/libs are not available问题现象:configure: error: --with-x=yes (default) and X11 headers/libs are not available解决方案:有些参数默认会报错,但去掉对编译没有影响,可以去掉后试一下解决办法: 设置参数 --with-x=no,或者 yum install libX11-devel yum install libXt-devel2.11 configure: error: "liblzma library and headers are required"问题现象:configure: error: "liblzma library and headers are required"解决方案:缺少某些依赖,但是有些依赖无法通过yum源来进行安装,所以需要下载源码编译安装解决办法: 从官网下载相关依赖源码包,提前编译源码 wget https://tukaani.org/xz/xz-5.2.4.tar.gz tar -zxvf xz-5.2.4.tar.gz cd xz-5.2.4/ ./configure make make install2.12 checking whether PCRE support suffices... configure: error: pcre >= 8.20 library and headers are required问题现象:checking whether PCRE support suffices... configure: error: pcre >= 8.20 library and headers are required解决方案:当前版本不够,需要升级,yum安装一般是低版本,所以,如果出现版本过低,需要下载最新的版本,通过源码安装。解决办法:wget https://nchc.dl.sourceforge.net/project/pcre/pcre/8.42/pcre-8.42.tar.gztar -zxvf pcre-8.42.tar.gzcd pcre-8.42.tar.gz./configuremakemake install 2.13 configure: error: libcurl >= 7.22.0 library and headers are required with support for https问题现象:configure: error: libcurl >= 7.22.0 library and headers are required with support for https,curl版本过低解决方案:升级curl版本解决办法:wget https://curl.haxx.se/download/curl-7.61.0.tar.gztar -zxvf curl-7.61.0.tar.gzcd curl-7.61.0/./configuremakemake install2.14 /lib64/libstdc++.so.6: version `GLIBCXX_x.x.xx' not found问题现象:glibc版本过低解决方案:内核某些相关组件版本过低,比如GLIBC,需要升级,如果升级后还是报错,原因的是历史版本也会存在,但不会自动切换为新版本,我们需要手动切换。查询当前内核版本,是否有错误提示没有找到的版本,如果没有则需要安装,如果有,ls -i查看软链接位置,链接到新的版本。解决办法: strings /lib64/libstdc++.so.6 | grep GLIBC确认是否包含GLIBCXX_ x.x.xx cd /lib64 rm -rf libstdc++.so.6 ln -s libstdc++.so.6.0.22 libstdc++.so.6
-
安装环境类别子项版本获取地址(方法) 硬件CPUHi1616--网络Eth-10GE--存储SATA/SSD--内存64G 2666MHz--OS凝思6.0.90--Kernel4.19.0--软件GCC8.3.0https://ftp.gnu.org/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.gz GMP6.1.0https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2ISL0.18https://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2MPC1.0.3https://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gzMPFR3.1.4https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2安装凝思OS 安装时注意选择开发环境 下载gcc8.3源码gcc 8.3下载地址https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.gzhttps://ftp.gnu.org/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.gz下载解压#tar -xvf gcc-8.3.0.tar.gz 依赖包下载安装运行 gcc-8.3.0/contrib/download_prerequisites 脚本下载如下依赖gmp6.1.0、isl0.18、mpc1.0.3、mpfr3.1.4如果因为通过proxy导致下载失败,可手动下载后放到 gcc-8.3.0目录下gmp6.1.0、isl0.18、mpc1.0.3、mpfr3.1.4下载地址:https://gcc.gnu.org/pub/gcc/infrastructure/下载的gmp-6.1.0.tar.bz2、isl-0.16.1.tar.bz2、mpc-1.0.3.tar.gz、mpfr-3.1.4.tar.bz2包如下:进入 gcc-8.3.0目录中:wget https://gcc.gnu.org/pub/gcc/infrastructure/gmp-6.1.0.tar.bz2wget https://gcc.gnu.org/pub/gcc/infrastructure/isl-0.18.tar.bz2wget https://gcc.gnu.org/pub/gcc/infrastructure/mpc-1.0.3.tar.gzwget https://gcc.gnu.org/pub/gcc/infrastructure/mpfr-3.1.4.tar.bz2将安装包放于解压后的gcc-8.3.0目录下1. 注釋掉gcc-8.3.0/contrib/download_prerequisites文件的218~225行2. 在gcc-8.3.0目录下,执行命令./contrib/download_prerequisites2 编译安装进入gcc-8.3.0目录mkdir gcc83builddircd gcc83builddir../configure --prefix=/usr/local/gcc-8.3.0 --enable-checking=release --enable-language=c,c++,fortran --disable-multilib make -j 64make install支持c,c++,fortran3 环境变量设置vim /etc/profile加入: export export PATH=/usr/local/gcc-8.3.0/bin:$PATH export LD_LIBRARY_PATH=/usr/local/gcc-8.3.0/lib64:$LD_LIBRARY_PATHsource一下source /etc/profile4 验证执行gcc -v b.gfortran -v简单测试验证:vim hellof90.f90输入如下内容:program mainwrite(*,*) "hello fortran world."end program main 编译执行:gfortran hellof90.f90 -o hellof90./hellof90
-
1、简介gcc for linux(gcc编译器)是一款针对linux系统而开发的编译器软件。gcc for linux对自由软件类 Unix操作系统和一些所有权操作系统。Linux系统下的gcc(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。官方链接:http://tsung.erlang-projects.org/类别:工具&插件2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.5Kernel4.14软件包Gcc7.3.0https://ftpmirror.gnu.org/gcc/gcc-7.3.0/gcc-7.3.0.tar.xz 3、依赖安装yum install -y wget gcc4、组件编译安装 下载源码包cd /optwget https://ftpmirror.gnu.org/gcc/gcc-7.3.0/gcc-7.3.0.tar.xztar –xf gcc-7.3.0.tar.xz 下载安装依赖进入解压好的目录,并执行以下命令下载安装依赖(时间稍长,耐心等待)cd gcc-7.3.0./contrib/download_prerequisites 编译:创建编译目录cd /usr/localmkdir gcc-build-7.3.0cd gcc-build-7.3.0/opt/gcc-7.3.0/configuremake –j8 (添加-j8,否则编译时间太长) make install 5、系统配置 无6、测试查看版本信息gcc -v 7、参考信息无 8、FAQQ:下载依赖包报错 A:原因分析:未发现GMP、MPFR和MPC tar下载包的解压目录解决方法:删除下载的四个tar包,重新执行./contrib/download_prerequisites
-
1、简介gcc是GNU编译器套件(GNU Compiler Collection),它包括了C、C++、Objective-C、Fortran、Java、Ada、Go语言和D语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。 类别:语言2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.6Kernel4.14软件包 Gcc8.3.0http://mirror.hust.edu.cn/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.gz3、依赖安装 安装依赖包# yum install -y gmp gmp-devel mpfr mpfr-devel libmpc libmpc-devel4、组件编译安装获取gcc-8.3.0发布包,并解压# wget http://mirror.hust.edu.cn/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.gz# tar -xf gcc-8.3.0.tar.gz编译安装# cd gcc-8.3.0# ./configure -enable-checking=release -enable-languages=c,c++ -disable-multilib --prefix=/usr/local/gcc-8.3.0#nohup make &# make install# cp /usr/local/gcc-8.3.0/lib64/libstdc++.so.6.0.25 /usr/lib64/# ln -sf libstdc++.so.6.0.25 /usr/lib64/libstdc++.so.6# ln -sf gcc /usr/local/gcc-8.3.0/bin/cc配置环境变量# export PATH_BAK=$PATH# export PATH=/usr/local/gcc-8.3.0/bin/:$PATH5、系统配置 无6、测试检查gcc是否安装成功# gcc --version显示如下信息说明成功:7、参考信息 无8、FAQ无
上滑加载中
推荐直播
-
全面解析华为云EI-API服务:理论基础与实践应用指南
2024/11/29 周五 18:20-20:20
Alex 华为云学堂技术讲师
本期直播给大家带来的是理论与实践结合的华为云EI-API的服务介绍。从“主要功能,应用场景,实践案例,调用流程”四个维度来深入解析“语音交互API,文字识别API,自然语言处理API,图像识别API及图像搜索API”五大场景下API服务,同时结合实验,来加深开发者对API服务理解。
回顾中 -
企业员工、应届毕业生、在读研究生共探项目实践
2024/12/02 周一 19:00-21:00
姚圣伟 在职软件工程师 昇腾社区优秀开发者 华为云云享专家 HCDG天津地区发起人
大神带你一键了解和掌握LeakyReLU自定义算子在ONNX网络中应用和优化技巧,在线分享如何入门,以及在工作中如何结合实际项目进行学习
即将直播 -
昇腾云服务ModelArts深度解析:理论基础与实践应用指南
2024/12/03 周二 14:30-16:30
Alex 华为云学堂技术讲师
如何快速创建和部署模型,管理全周期AI工作流呢?本期直播聚焦华为昇腾云服务ModelArts一站式AI开发平台功能介绍,同时结合基于ModelArts 的实践性实验,帮助开发者从理论到实验更好地理解和使用ModelArts。
去报名
热门标签